您的位置:首页 > 其它

完全背包解析[以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]);
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: