标签:博客 for 多重 net 代码实现 注意 com log https
https://blog.csdn.net/yandaoqiusheng/article/details/84782655 背包问题九讲个人整理, 很好。
https://blog.csdn.net/qq_33997572/article/details/79216132 hdu 1059 多重背包 代码实现
要求背包正好装满
这里按照一般的做法是dp数组全部赋值为负无穷,然后dp[0]=0,然后就和普通的背包过程一样了。就想下面一样。
for(int i=1; i<=n; i++)
 for(int j=V; j>=w[i]; j--)
     f[j]=max(f[j], f[j-w[i]] + v[i]);这里如果再加一步处理的话会更好,如下:
for(int i=1; i<=n; i++)
 for(int j=V; j>=w[i]; j--)
        if(dp[j-w[i]] > -inf)//这样每一次的转换都是从前面有效的状态转一过来
         f[j]=max(f[j], f[j-w[i]] + v[i]);如果物品的重量有是负数的话
poj 2184就是数据中有负数。
解决方法是使得背包的向右扩展。这里参考这个题的题解,点我
//01背包
for(int i=1; i<=n; i++)
{
    for(int j=V; j>=w[i]; j--)
    {
        f[j]=max(f[j], f[j-w[i]] + v[i]);
    }
 }
 
//完全背包问题
for(int i=1; i<=n; i++)
{
    for(int j=w[i]; j<=V; j++)
    {
        f[j]=max(f[j], f[j-w[i]]+v[i]);
    }
 } 
 
//多重背包
for(int i=1; i<=n; i++)
{
    int min_num=min(num[i], V/w[i]);
    for(int k=1; min_num>0; k<<=1)
    {
        if(k>min_num)
            k=min_num;
        min_num-=k;
        for(int j=V; j>=w[i]*k; j--)
        {
            f[j]=max(f[j], f[j-w[i]*k]+v[i]*k);
        }
    }
}标签:博客 for 多重 net 代码实现 注意 com log https
原文地址:https://www.cnblogs.com/alking1001/p/12368703.html