/*
完全背包
问题: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 完全背包 为例]
最新推荐文章于 2020-03-16 21:23:28 发布