01背包
2015-08-15 09:59
281 查看
01背包
什么是01背包?
01背包就是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为C1,C2,…,Cn,与之相对应的价值为W1,W2,…,Wn。求将哪些物品装入背包可使总价值最大。01背包的分析:
子问题:F[i][j]表示前 i 件物品中选取若干件物品放入剩余空间为 j 的背包中所能得到的最大价值。判断第 i 件物品放还是不放:
F [ i ][ j ] = max { F [ i-1 ][ j ] ,F[ i-1 ][ j-C[ i ] ] + w[ i ] }。
F [ i-1 ][ j ] 表示前i-1件物品中选取若干件物品放入剩余空间为j的背包中所能得到的最大价值。
F[ i-1 ][ j-C[ i ] ] + w[ i ] 表示前i-1件物品中选取若干件物品放入剩余空间为j-C[i]的背包中所能取得的最大价值加上第i件物品的价值。
模板代码:
二维数组:#include <iostream> #include <string.h> #include <stdio.h> int dp[1001][1001],c[1001],w[1001]; int main() { int t,k,v,i,j; scanf("%d",&t); while(t--) { scanf("%d %d",&k,&v); memset(dp,0,sizeof(dp));//初始化操作 for(i=1;i<=k;i++) scanf("%d",&w[i]); for(i=1;i<=k;i++) scanf("%d",&c[i]); for(i=1;i<=k;i++) { for(j=0;j<=v;j++) { if(c[i]<=j)//表示第i个物品将放入大小为j的背包中 dp[i][j]=dp[i-1][j]>(dp[i-1][j-c[i]]+w[i])?dp[i-1][j]:(dp[i-1][j-c[i]]+w[i]);//第i个物品放入后,那么前i-1个物品可能会放入也可能因为剩余空间不够无法放入 else dp[i][j]=dp[i-1][j];//第i个物品无法放入 } } printf("%d\n",dp[k][v]); } return 0; }
一维数组:(优化版)
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; int dp[1001],c[1001],w[1001]; int main() { int t,k,v,i,j; scanf("%d",&t); while(t--) { scanf("%d %d",&k,&v); memset(dp,0,sizeof(dp)); for(i=1;i<=k;i++) scanf("%d",&w[i]); for(i=1;i<=k;i++) scanf("%d",&c[i]); for(i=1;i<=k;i++) { for(j=v;j>=c[i];j--) { dp[j]=dp[j]>(dp[j-c[i]]+w[i])?dp[j]:(dp[j-c[i]]+w[i]); } } printf("%d\n",dp[v]); } return 0;
该方法只是对背包的空间进行优化。
事实上,这要求在每次主循环中我们以v=V..0的顺序推dp[v],这样才能保证推dp[v]时dp[v-c[i]]保存的是状态dp[i-1][v-c[i]]的值。
所以这种解法只能由V--0,不能反过来,如果反过来就会造成物品重复放置!
练习题目:
hdu oj 2602 Bone Collector相关文章推荐
- Android休眠唤醒和wakeup_source机制的使用(2)
- JSP学习笔记(一)
- java中Statement详细用法
- Python开发环境的搭建(win7)
- python 数值类型,判断类型
- Java 创建型模式:单态模式,原型模式,工厂方法,抽象工厂,建造者模式
- 设计模式--观察者模式
- Android开发专栏之ListView一两种适配器的使用和优化
- extends ActionBarActivity 出现的问题
- Spring常用annotation标签
- [LintCode] Count 1 in Binary
- 手动编译安装nginx
- iOS 代理为啥要用weak修饰? (刨根问底一)
- 字典树模板
- 霓歌即时通讯中的相关专利整理(七)
- jQuery实现图片渐入渐出切换展示效果
- PowerPoint巧妙确定圆心的技巧商务ppt模板
- python快速使用(三)类、异常
- java.lang.Class Cast Exception: android.widget.HeaderViewListAdapter
- 配置java环境变量