0
点赞
收藏
分享

微信扫一扫

混合背包问题

西曲风 2022-03-14 阅读 24

混合背包问题包括了三种背包, 01 01 01 背包,完全背包,多重背包,首先我们需要了解他们之间的关系,不难发现,我们可以将 01 01 01 背包和多重背包一起处理, 01 01 01 背包就是 s = 0 s = 0 s=0 的多重背包,所以完全背包就直接套板子

for(int j = m; j >= v; j -- )
            f[j] = max(f[j], f[j - v] + w);

然后处理01背包和多重背包

            if(s == - 1) s = 1;
            for(int k = 1; k <= s; k *= 2)
            {
                for(int j = m; j >= k * v; j -- )
                    f[j] = max(f[j], f[j - k * v] + k * w);
                s -= k;
             }
            if(s)
            {
                    for(int j = m; j >= s * v; j -- )
                       f[j] = max(f[j], f[j - s * v] + s * w);
            }

最后还要把剩下没有减完的 s s s 给减掉,防止遗漏

举报

相关推荐

背包问题【01背包】

0 条评论