
1、 确定子问题

子问题为:当前容量为j(纵轴)时,在i(横轴)个物品中取物的最大价值 J=容量,i=物品数,v=最大价值 v为子问题!!!
2、 确认状态
每个物品都有两种状态,取或不取。还要保证取了的价值一定比不取高,因为我们的最终目标不是做选择,而是从中找最优解。
3、推出方程

举例: 当物品数量为1时,背包容量大于物品重量,拿一定为最优解,否则不拿。 当物品数量为2时,取(判断取了之后,剩余的容量的最优解加上本身是否为最优),否则不取。 …
4、 确定边界
因为每一个行都依赖上一行所以,要么手动初始化第一行,要么将下标由1开始记录,下标为0的元素初始化为0 物品个数初始为1 ,背包容量初始为0,不要搞错啦!!
5、 优化
太菜了,还没学明白
6、 代码实现
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>v[i]>>w[i];
for(int i=1;i<=n;i++)
for(int j=0;j<=m;j++)
{
if(j>=v[i]) f[i][j] =max(f[i-1][j],w[i]+f[i-1][j-v[i]]);
else f[i][j]= f[i-1][j];
}
int res=0;
for(int i=0;i<=m;i++) res=max(f[n][i],res);
cout<<res<<endl;
|