完全背包
定义:有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的体积是v[i],价值是val[i]。将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
完全背包与01背包的区别就是每件物品有无限件。
例题
解题思路:
这道题和采药的不同在于可以无限采取草药,也还需注意数据范围。
与 01 背包问题的代码只有v的循环次序不同,需要一个已选入第i种物品的结果 f[i][v-w[i]]。
#include<iostream>
#include<cmath>
using namespace std;
const int N=1e4+10,M=1e7+10;
int n,m;
long long q[M];
int v[N],w[N];
int main()
{
cin>>m>>n;
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++)
{
q[j]=max(q[j],q[j-v[i]]+w[i]);
}
cout<<q[m]<<endl;
return 0;
}