【代码随想录】完全背包
题目描述
分析
所谓完全背包就是各种物品的数量为无限的情况,这种题其实想一下是比01背包简单的,因为没有了物品数量的限制,往背包里放物品的过程变得更简单直观了。
很容易得到,在完全背包里只能遍历背包容量,而不能遍历物品,因为这时物品是无限的,这样的话我们只需要一边循环,从dp[0]一直遍历到dp[V]即可,而且这直接就是往背包里一个个放物品的过程。
由于只有一遍循环,所以不必担心dp数组被覆盖的问题,而且由于只进行一边循环,所以只能正序遍历dp数组而不能倒序。
复习一下为什么01背包里必须倒序遍历背包空间:
其实在01背包里正序遍历应该也不是不行,只不过需要加上visited数组来避免重复放入一个物品的问题,而在完全背包里自然没有这个问题,物品的数量是无限的。
代码如下:
#include<bits/stdc++.h>
using namespace std;
//动态规划:完全背包
int main(){
int N,V;
cin>>N>>V;
vector<int> weight;
vector<int> value;
int a,b;
for(int i = 0; i < N; i++){
cin>>a>>b;
weight.push_back(a);
value.push_back(b);
}
vector<int> dp(V+1, 0);
for(int j = 0; j <= V; j++){
for(int i = 0; i < N; i++){
if(j - weight[i] < 0){
continue;
}
dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
}
}
for(int i = 0; i <= V; i++){
cout<<dp[i]<<" ";
}
cout<<endl;
cout<<dp[V];
return 0;
}