完全背包
1.状态表示
a.集合:所有从第i个物品开始选,总体积不超过j的物品的集合
b.属性:max
2.状态计算:
a.f[i]的子集划分只要总体积不超过j就可以一直选
如上图,在1到i中选,且总体积小于等于j,
但第i个物品只能选0个,所以不选第i个物品
故最大值为f[i-1,j]
ps:做所有DP问题的时候,核心就是这个集合的定义
三重简化成2重的推导过程
总体推导过程:
核心伪代码:
最终代码:
#include <bits/stdc++.h>
using namespace std;
int n,v;
int c[1005],w[1005];
int f[1005][1005];
int main()
{
scanf("%d%d",&n,&v);
for(int i=1; i<=n; i++)
{
scanf("%d%d",&w[i],&c[i]);
}
//输入
for(int i=1; i<=n; i++)
{
for(int j=1;j<=v; j++)
{
f[i][j]=f[i-1][j];
if(j>=w[i])
{
f[i][j]=max(f[i][j],f[i][j-w[i]]+c[i]);
}
}
}
//核心代码
printf("%d",f[n][v]);
return 0;
}