蒟蒻不会DP的第n天......
完全背包:对于n种物品,每种物品有一个价值price[i],一个体积weight[i],现有一个背包体积为w,每种物品可以拿无数次,问最大可以拿走多少价值的物品。
思路:相对于01背包,每种物品不是取或不取,而是取1件,2件,......n件。
三重循环无优化解法:
转移方程:f[i][j]=max(f[i][j],f[i-1][j-k*weight[i]]+k*price[i]);
#include<bits/stdc++.h>
using namespace std;
int f[1010][1010];
int price[1010],weight[1010];
int n,w;
int main()
{
scanf("%d%d",&n,&w);
for(int i=1;i<=n;++i) scanf("%d%d",&price[i],&weight[i]);
for(int i=1;i<=n;++i)
for(int j=0;j<=w;++j)
for(int k=0;k<=j/weight[i];++k) f[i][j]=max(f[i][j],f[i-1][j-k*weight[i]]+k*price[i]);
//获得答案
int ans=0;
for(int j=0;j<=w;++j) ans=max(f[n][j],ans);
printf("%d",ans);
return 0;
}
时间复杂度太高,用处不大,但可以帮助理解完全背包的基本思路。
二重循环优化解法:
其实我们可以把完全背包看成01背包,可以理解为:在取了当前种类物品一次后再取一次,就变成01背包了。
转移方程:f[i][j]=max