背包模板

01背包

取或不取 保证只选一次 倒序枚举剩余空间

for (int i=1;i<=n;i++)
	for (int j=v;j>=c[i];j--)
	  dp[j]=max(dp[j],dp[j-c[i]]+w[i]);
完全背包

可取无限次 正序枚举剩余空间

for (int i=1;i<=n;i++)
	for (int j=c[i];j<=v;j++)
	  dp[j]=max(dp[j],dp[j-c[i]]+w[i]);

多重背包

某件物品可取k次 倒序枚举剩余空间

for (int i=1;i<=n;i++)
	for (int j=v;j>=c[i];j--)
		for (int l=1;l<=k[i];l++)
	  dp[j]=max(dp[j],dp[j-l*c[i]]+l*w[i]);


以上的算法皆是时间空间复杂度最低的算法

posted @ 2016-11-17 13:32  2000xyy  阅读(109)  评论(0编辑  收藏  举报