[51nod]多重背包模板
2017-05-11 17:36
176 查看
https://www.51nod.com/tutorial/course.html#!courseId=11
题目大意:
有$N$种物品和一个容量为$W$的背包。第$i$种物品最多有$c[i]$件可用,每件体积是$w[i]$,价值是$v[i]$。求解将哪些物品装
入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
解题思路:采用二进制拆分的思想,将有限的背包划分为01背包和完全背包解决。
转移方程:$dp[i][j] = \max \{ dp[i - 1][v - k*w[i]] + k*v[i]|0 \le k \le c[i]\} $
#include<bits/stdc++.h> using namespace std; typedef long long ll; int c[50002],w[50002],v[50002],N,W; ll dp[50002]; void bag01(int ww,int vv){ for(int i=W;i>=ww;i--){ dp[i]=max(dp[i],dp[i-ww]+vv); } } void bagcomplete(int ww,int vv){ for(int i=ww;i<=W;i++){ dp[i]=max(dp[i],dp[i-ww]+vv); } } void bagmult(){ memset(dp,0,sizeof dp); for(int i=0;i<N;i++){ if(c[i]*w[i]>W){ bagcomplete(w[i],v[i]); } else{ int k=1; while(k<c[i]){ bag01(k*w[i],k*v[i]); c[i]-=k; k<<=1; } bag01(c[i]*w[i],c[i]*v[i]); } } } int main(){ scanf("%d%d",&N,&W); for(int i=0;i<N;i++){ scanf("%d%d%d",w+i,v+i,c+i); } bagmult(); printf("%lld",dp[W]); }
相关文章推荐
- 【51nod 1085】背包问题(0-1背包模板)
- 多重背包模板 51Nod 1086
- 完全背包模板 51Nod 1101
- LightOJ 1231 Coin Change (I) (背包计数模板题)
- [背包DP][小技巧] LOJ#6089. 小 Y 的背包计数问题 && 51NOD 1597 有限背包计数问题
- HDU 2191 512大地震 【多重背包模板题】
- hdu 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包模板题)
- 51nod 1086 背包问题 V2 (多重背包二进制优化)
- 51nod 1085 背包问题(01背包)
- 51nod 1086 背包问题V2 (巧妙dp,二进制)
- 优化后的01背包模板
- 多重背包模板
- 背包模板(01背包,完全背包,多重背包)
- hrbust 哈理工 2252 完全背包模板题
- hdu1171big events in hdu【多重背包模板】【01背包】
- 多重背包模板
- 0 1背包模板
- 背包问题模板
- ycb的ACM进阶之路(多重背包模板)
- 杭电-1248 寒冰王座(完全背包模板)