完全背包

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

原文地址:https://www.cnblogs.com/Jason66661010/p/12788601.html