https://blog.csdn.net/qq_38984851/article/details/81133840
有 N 种物品和一个容量为 V 的背包,每种物品都有无限件可用
。放入第 i 种物品 的费用是 Ci,价值是 Wi。求解:将哪些物品装入背包,可使这些物品的耗费的费用总 和不超过背包容量,且价值总和最大。
分解一:一个物品最多可以选(背包空间数/该物品大小)个,我们就把它当作(背包空间数/该物品大小)个相同的物品,变为01背包
分解二:如图的进一步分解
01背包在二维数组上操作,就是为了防止一个物品被放入多次的情况。因此一维数组可以满足完全背包的问题。如下:
tab[j] = max(tab[j-weight[i]]+value[i],tab[j]);({i,j|0<i<=n,0<=j<=total})
代码
#include<cstdio>
#include<algorithm>
using namespace std;
int w[300],c[300],f[300010];
int V,n;
int main()
{
scanf("%d%d",&V,&n);
for(int i=1; i<=n; i++)
{
scanf("%d%d",&w[i],&c[i]);
}
for(int i=1; i<=n; i++)
for(int j=w[i]; j<=V; j++)//注意此处,与0-1背包不同,这里为顺序,0-1背包为逆序
f[j]=max(f[j],f[j-w[i]]+c[i]);
printf("max=%d
",f[V]);
return 0;
}
01背包与完全背包逆序顺序问题的详细讲解:
https://blog.csdn.net/yandaoqiusheng/article/details/84929357