背包问题-完全背包模型
完全背包问题是背包九讲中非常经典的问题,与01背包的差别就是每个物品可以选择多次。
使用滚动数组压缩也不难理解
简单来说就是f[i][j]=max(f[i-1][j],f[i-1][j-w]+v);这个递推方程中f[i]只与f[i-1]有关 那么就可以把这一维约掉,但约掉的同时要保证f[i]的状态一定是由f[i-1]转移过来的,这可以利用第二重循环去控制,手动模拟一下就可以了。
01背包第二重循环倒着来,完全背包正着来就可以。证明有一定难度 大家可以自行掌握,从竞赛角度来说记住就有机会骗分hhhhh.
给个例题
洛谷P2722 usaco的题目
分析:耗时对应背包的体积 得分对应价值
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N = 100010;
int w,v;
int n,m;
int f[N];
int main(){
cin>>m>>n;
for(int i=1;i<=n;i++){
cin>>v>>w;
for(int j=w;j<=m;j++){
f[j]=max(f[j],f[j-w]+v);
}
}
cout<<f[m]<<endl;
return 0;
}