01背包和完全背包

题目大意:有n 个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?

每个物品的设置为w[i],它的价值设置为c[i]。背包总容量为V。设F[ ] 是每个重量的最大价值。

状态转移方程为 F[i] = max( F[i-1], F[i-w[i]]+c[i] )。

每个物品只能取一次,所以要倒推。最后的结果是F[V]。

核心代码:

for(int i = 1; i <= n; i++){
	for(int j = V; w[i] <= j; j--)
		{
			f[j] = max(f[j],f[j-w[i]]+c[i]);
			cout<<j<<" "<<f[j]<<" ";
		}
		cout<<endl;
	}

 完全背包的区别是,每个物品可以取无限次。所以直接正推就行了。最后的结果也是F[V]。

核心代码:

for(int i = 1; i <= n; i++){
	for(int j = w[i]; j <= V; j++)
		{
			f[j] = max(f[j],f[j-w[i]]+c[i]);
			cout<<f[j]<<" "; 
		}
		cout<<endl;
	}
原文地址:https://www.cnblogs.com/stul/p/10314379.html