中级篇——背包问题2(完全背包)
2015-12-16 20:48
399 查看
01背包是指每件物品有且只有一件,而完全背包则是每件物品件数无限,求装入背包所对应的最值。
完全背包也有公式,在01背包公式的基础上加以改动。
完全背包公式:dp [ j ] =min/max( dp [ i ] [ j ] ,dp [ j - w [ i ] ] + v [ i ] ) 。
给出一道例题加以分析。
典例:http://acm.hdu.edu.cn/showproblem.php?pid=1114
题意:给出存钱罐空时的重量和装满时的重量,给出n种钱币的价值和重量,求存钱罐装满时所能达到的最小价值
分析:从第一个开始遍历,从重量 j >=w[ i ] 开始计算,比较装下物品 i 后的价值和没装 i 时的价值选最优解。因为背包必须装满,故最终输出dp[ full - Empty ]的价值。
完全背包也有公式,在01背包公式的基础上加以改动。
完全背包公式:dp [ j ] =min/max( dp [ i ] [ j ] ,dp [ j - w [ i ] ] + v [ i ] ) 。
给出一道例题加以分析。
典例:http://acm.hdu.edu.cn/showproblem.php?pid=1114
题意:给出存钱罐空时的重量和装满时的重量,给出n种钱币的价值和重量,求存钱罐装满时所能达到的最小价值
分析:从第一个开始遍历,从重量 j >=w[ i ] 开始计算,比较装下物品 i 后的价值和没装 i 时的价值选最优解。因为背包必须装满,故最终输出dp[ full - Empty ]的价值。
#include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> #include <math.h> #define INF 1000000001 using namespace std; int w[505],v[505],dp[10005]; int main() { int T,n,m,Empty,full; cin>>T; while(T--) { cin>>Empty>>full; m=full-Empty; //m表示存钱罐能装钱币的重量 cin>>n; for(int i=1;i<=n;i++) { cin>>v[i]>>w[i]; } dp[0]=0; for(int i=1;i<=m;i++)//dp数组初始化 dp[i]=INF; for(int i=1;i<=n;i++) for(int j=w[i];j<=m;j++) dp[j]=min(dp[j],dp[j-w[i]]+v[i]); if(dp[m]<INF) cout<<"The minimum amount of money in the piggy-bank is "<<dp[m]<<"."<<endl; else cout<<"This is impossible."<<endl; } return 0; }
相关文章推荐
- cuda内存总结
- 试图添加进 ScrollerVier 的视图里,默认下移64个像素
- oracle存储过程中传入日期参数,插入到表
- poj1088滑雪【记忆化搜索 初级题】
- 追踪系统调用流程
- iOS UIAlertController提示框
- 合唱队形
- 一个实现数据批量从mongodb导入Mysql的方案
- [译]An Approach to Game Design
- NuGet学习笔记——初识NuGet及快速安装使用
- [No000067]Js中获取当前页面的滚动条纵坐标位置scrollTop
- ZigZag Conversion
- <LeetCode OJ> 70. Climbing Stairs
- Java List序列化的实现
- 模拟退火
- Google Appengine参考路径
- Promise模式编程链式调用中的一个小坑——匿名函数
- 优先队列和索引优先队
- 荷花-处女作-少一个叶
- 各种文件的上传及下载