动态规划-背包问题
Posted cyj1258
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划-背包问题相关的知识,希望对你有一定的参考价值。
- 0-1背包
- 题意: 给定一个具备一定承重的背包,给定n个物品,每个物品具备一定的价值,和重量,每个物品只能装一次,问最大能装多大价值的物品。
- 例题 poj3624:Charm Bracelet AC代码
- 完全背包
- 题意: 给定一个具备一定承重的背包,给定n个物品,每个物品具备一定的价值,和重量,每个物品可以装任意次,问装满背包最大(小)能装多大价值的物品。
- 例题 poj1384:Piggy-Bank AC代码
- 多重背包
- 题意:给定一个具备一定承重的背包,给定n个物品,每个物品具备一定的价值,和重量,每个物品能够装有限次,问最大能装多大价值的物品。
- 通过进行拆分之后,利用0-1背包进行求解。任何数量k都可以拆解为(2^0,2^1,2^2, … 2^i,k-(2^0+2^1+…+2^i)。并且1-k之内的数字都能用上面的数字组合出来,例如6拆分成(1,2,3) 1-6之间的数字都能用上述三个数字组合出来,因此拆分之后可利用0-1背包求解
- 多重背包 AC代码
- poj 2392:Space Elevator AC代码
- 百练:1742:Coins AC代码
for(int i=0;i<n;i++){//考虑前i个物品 for(int j=m;j>=0;j--){//考虑背包承重为j的时候 if(j>=w[i]){//如果物品能够放进背包 dp[j] = max(dp[j],dp[j-w[i]]+v[i]);//考虑放与不放的最大值 } } }
for(int i=0;i<n;i++){ //考虑前i个物品 for(int j=0;j<=m;j++){//考虑背包称重为j 的时候 if(j>=w[i]){ //如果物品能够放进去 dp[j] = min(dp[j],dp[j-w[i]]+v[i]); } } }
for(int i=0;i<m;i++){//拆分 int temp = 1; int num,volumn,value; cin>>num>>volumn>>value; while(num-temp>0){ g[cnt].volumn = temp*volumn; g[cnt].value = temp*value; cnt++; num = num - temp; temp = temp*2; } g[cnt].volumn = num*volumn; g[cnt].value = num*value; cnt++; } for(int i=0;i<cnt;i++){ for(int j=v;j>=g[i].volumn;j--){ dp[j] = max(dp[j],dp[j-g[i].volumn]+g[i].value); } }
以上是关于动态规划-背包问题的主要内容,如果未能解决你的问题,请参考以下文章