问题描述:
现在给你一个容量为V的背包,有N个物品,其中第i件物品的重量为wi,价值为vi,第i件物品一共有si件,问在有限的容量内,最多可以拿到多少价值的物品。
题目分析:
仔细一看,多重背包问题和完全背包问题的差距就在物品的个数上,完全背包问题是同一类物品有无数件,但多重背包不让着你,多重背包给你规定了最多件数。仔细看看还挺有意思,01背包是要么0件要么1件,多重背包是要么可以选0~si件,而完全背包则是可以选0~∞件。
那我们拓展一下思维,这是规定了同类物品最多能拿的个数,要是规定了第i类物品最少要拿多少件呢?很容易想到,只需要初始化的时候提前拿一些,就转换成了01背包问题咯(题外话题外话)
回归正题,多重背包问题就是在完全背包问题加了一个限制条件,“最多能拿si件”。那我们只需要改一改完全背包问题的代码,不就迎刃而解了吗?
假设取前i件物品装入容量为V的背包,第i件物品拿k件所得到的最大值为dp[i][j]
那么dp[i][j]=max(dp[i][j],dp[i-1][j-k*w[i]]+k*v[i])这里的k的范围是:0≤k≤s[i]
于是代码如下...
#include<iostream>
#incl

这篇博客探讨了背包问题的三种类型:01背包、完全背包和多重背包。重点在于如何将完全背包问题转化为多重背包问题,通过修改代码实现。博主给出了一维和二维动态规划的解决方案,并提供了C++代码示例,展示了如何在有限容量下求解物品最大价值。
最低0.47元/天 解锁文章
803

被折叠的 条评论
为什么被折叠?



