完全背包与01背包的区别是:完全背包每个物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包内,总价值最大。
完全背包与01背包在代码层面的不同则体现在遍历顺序上:
01背包--内层的循环是从大到小的倒序遍历,这样做的目的是为了让每个物体仅被添加一次;
完全背包--由于物品是可以多次添加的,所以内层的循环仍然从小到大进行遍历。
//完全背包问题
void test02() {
vector<int> weight = { 1,3,4,1 };
vector<int> value = { 15,20,40,25 };
int bagweight = 4;
//初始化
vector<int> dp(bagweight + 1, 0);
for (int i = 0; i < weight.size(); i++)
{
for (int j = weight[i]; j <= bagweight; j++)//背包正序
{
dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
}
for_each(dp.begin(), dp.end(), [=](int x) {cout << x << " "; });
cout << endl;
}
cout << dp[bagweight] << endl;
}
int main() {
test02();
}