动态规划背包问题——完全背包

完全背包:

问题背景描述:
你有一个容量为V的背包,现在有N种物品供你选择,每件物品可以选择无数次,每种物品所占的空间为c[i],价值为v[i],现在让你作出最佳方案,使背包中的总价值最大。
有了之前01背包的基础,我们很快就能写出完全背包的状态转移方程

f[i][j] = max{f[i-1][j – k * c[i]] + k * v[i]|0<=k * c[i] <=v}

但是这样的时间复杂度就很大了O(V*∑V/c[i])
这里我提供一种O(VN)算法
在01背包中提到在用滚动数组的方法时候,我们要将内层循坏写逆序的,这样是为了保证在考虑要不要拿第i件物品时依赖的是一个没有选入i物品的f[i-1][j – c[i]],而在这里恰恰是需要一个可能选入了第i件物品的f[i][j – c[i]],所以,我们就可以轻松地写出O(VN)算法了
贴上代码:

for(int i = 1; i <= N; i++)//N表示物品种类 V表示背包容量
	for(int j = c[i]; j <= V; j++)
	f[i] = max(f[j], f[j - c[i]] + v[i]);
	cout << f[V];

注:本文为原创,开源,供大家一起讨论学习,转载注明出处。

猜你喜欢

转载自blog.csdn.net/yezi_coder/article/details/103495337
今日推荐