完全背包问题
大体上与01背包问题类似,区别在于:完全背包问题没有对于物品数量的限制
- 记录体积, 记录价值, 记录状态 (朴素做法用二维)
- : 将 分为包含第 个数和不包含第 个数。
优化方法也是滚动数组。
代码区别点:完全背包问题对于 是正序遍历。
正序遍历原因:
- 充分性:由于完全背包问题没有数量限制,因此不存在01背包中出现的的限制
- 必要性:由于没有数量限制,所以会出现的情况,因此这时候 的值不来源于 ,即不来自于上一层,而是来源于同一层中的前 个值,因此优化为一维数组后,需要更新过的、可能已经含有第 种物品的 数组。
#include<iostream>#include<algorithm>using namespace std;
const int N =1010;
int n,m;int f[N],v[N],w[N];
int main(){ cin>>n>>m; for(int i=1;i<=n;i++)cin>>v[i]>>w[i]; for(int i=1;i<=n;i++) for(int j=v[i];j<=m;j++) f[j]=max(f[j],f[j-v[i]]+w[i]); cout<<f[m]; return 0;}