完全背包解析[以NYoj 311 完全背包 为例]
2013-07-20 15:00
169 查看
/* 完全背包 问题:N件物品和体积V的背包,第i件物品的体积是v[i]、价值是w[i]. 求解:哪些物品放入背包可以使背包物品价值最大. 特点:每种物品有无限多件.可以放0件,1件,2件,....多件. 状态转移方程:dp[i][j]=max(dp[i][j],dp[i-1][j-k*v[i]]+k*w[i]|0<=k*v[i]<=V); 解释:完全背包和0-1背包的不同就在于完全背包可以放多件.而0-1背包就只能放1件. 其他方法:1.由于对于体积为v[i]的物品,放入体积V的背包中,最多可以放V/v[i]个. 所以我们可以把无限件物品转化成有固定件,就可以转化成0-1背包. 2.有一种二进制优化方案可以更进一步的改善,将在下一步的多重背包中解释. */ //NYoj 311 完全背包(恰好装满). #include<stdio.h> #include<string.h> #define max(a,b) a>b?a:b #define min -0x0ffffff; int main() { int T; scanf("%d",&T); while(T--) { int N,V,v[2005],w[2005],dp[50005]; scanf("%d%d",&N,&V); dp[0]=0; for(int i=1;i<=V;i++) dp[i]=min; for(int i=1;i<=N;i++) scanf("%d%d",&v[i],&w[i]); for(int i=1;i<=N;i++) { for(int j=v[i];j<=V;j++) dp[j]=max(dp[j],dp[j-v[i]]+w[i]); } if(dp[V]<0) printf("NO\n"); else printf("%d\n",dp[V]); } }
相关文章推荐
- 完全背包 nyoj 311
- nyoj311完全背包【完全背包+判断是否装满】
- nyoj311 完全背包
- NYOJ 311 完全背包
- NYOJ_311_完全背包
- NYOJ 311 完全背包
- NYOJ 311 完全背包
- NYOJ - 311 - 完全背包(背包问题)
- NYOJ 311 完全背包
- NYOJ311完全背包
- NYOJ311 完全背包
- NYOJ 311 完全背包(完全背包)
- NYOJ 311 完全背包(完全背包模型)
- NYOJ 311 完全背包
- 完全背包(nyoj 311)
- nyoj311-完全背包(01背包更深入理解)
- NYOJ 311 完全背包
- NYOJ 311 完全背包【恰好装满完全背包】
- NYOJ-311-完全背包
- nyoj 311 完全背包