有一些项目类型(N种),每种都有重量wi和成本ci。每一个都有无限的数目。问题是制作一个背包,精确的重量(W)和最小的物品总成本。我知道我应该在这种情况下使用动态,但它不是一个普通的背包问题,我找不到关系。我也发现了一些类似的问题,但我没有理解这些解决方案。这里是链接1,2。 如何使用DP来解决它?背包的变化 - 确切重量的最低总成本
回答
设F [I]的装置,以获得重量i,则最小成本。 g [i]意味着是否可以合并完全的权重i;
f[0]=0;g[0]=true;
for (int i=0;i<N;i++)
for (int j=0;j<W;j++)
if (g[j]) {
g[j+w[i]]=true;
if (f[j+w[i]]==0||f[j+w[i]]>f[j]+c[i])
f[j+w[i]]=f[j]+c[i];
}
if (g[W]) return f[W];
else return 0;//impossible
假设你想找到最小的代价就可以带你到完成的W
的重量和c_i > 0
和w_i > 0
然后我们可以定义min_cost(i, W)
为仅能够使用的物品来实现从i
到N
最小的代价其重量为W
基本情况发生的时候,我们只有一个项目,从而
i=N
时。在这种情况下,解决办法是:min_cost(N, 0) = 0
,因为如果我们不使用项目N
那么我们已经等于0min_cost(N, W) = c_i * W/w_i
的重量,如果W
是w_i
即W mod w_i = 0
min_cost(N, W) = Infinity
的倍数,否则自我们无法完成只有最后一项的W
的权重。min_cost(i, W) = min(c_i * k + min_cost(i+1, W - k * w_i))
为k=0
直到W - k*w_i < 0
,我们将使用项目i
多次尽可能的经常性关联状态,而我们还没有作出:作为
复发关系现在可以说比W
大的重量。
然后,您可以使用递归算法使用memoization实施此方法,并根据您认为合适的实际解决方案进行存储(k
s在递归中)。
编辑如果我们注意到有两种情况会影响min_cost(i, W)
,那么可以通过建议加快速度。这种情况是第一次的时候并不需要在所有即min_cost(i+1, W)
以及何时使用第i个项目,我们要至少一次使用第i个项目,这是一样的,因为min_cost(i, W - w_i)
我们可能会使用项目i
超过一次。这改变了我们的再次发生如下:
min_cost(i, 0) = 0 // We already reached our goal
min_cost(i, W) = Infinity // if (W < 0 or i > N) then we can't get to W
min_cost(i, W) = min(min_cost(i+1, W), min_cost(i, W - w_i) + c_i)
这是一个加速:如果对于给定的i,你按递增顺序计算权重,那么为了计算'min_cost(i,W)',你只需要尝试将项目i的0个实例添加到项目i + 1的最优解..N或1个项目i到最优解*(对于项目i ... N *(因为它具有较低的权重,您已经计算):min_cost(i,W)= min(min_cost(i + 1, W),min_cost(i,W-w_i)+ c_i)'。在所有权重均为1的最差情况下,这会杀死W的一个因子。 – 2013-03-18 16:10:05
我将该加速添加为答案的编辑。好的加速和简单的方式,谢谢! – 2013-03-18 18:09:32
不客气!附:如果你写了例如“@j_random_hacker”在评论中的某处,它会通知该人。我只注意到你的评论,因为我从虚荣中回来:-P – 2013-03-19 13:13:15
- 1. 最低成本的背包
- 2. 背包算法的变化
- 3. 找到物品的最佳组合,以最低的成本。也许背包变种?
- 4. Excel中的背包变化
- 5. 背包变异?
- 6. 最小的成本总和
- 7. 背包的变化...在python中
- 8. mysql总价最低
- 9. 背包问题的变体
- 10. 返回最低成本!
- 11. 非重叠间隔与总重量的最大总和W
- 12. 确定最低要求的PHP版本
- 13. 如何最小化最短路径树的总成本
- 14. 需要R包的最低版本
- 15. 成本最低的Windows VPS托管?
- 16. 收发器网络的最低成本
- 17. 仅选择最低成本的行
- 18. 最小化的总线改变的数量以矩阵
- 19. 变量本身的变化
- 20. 变量本身的变化
- 21. SQL:确定平均“最低”或“最低”
- 22. 显示WooCommerce变量产品的最低价格(版本2.5.5)
- 23. 使用背包解决硬币变化。参考:另一个背包Hackerrank CodeAgon
- 24. 多背包,重量=利润
- 25. SQL尝试捕捉造成近期变量的确切错误
- 26. 查找等于和最低成本总和的子集的算法
- 27. 正确初始化矢量成员变量的方法
- 28. 如何找到变量的确切值?
- 29. 确保变量的值是否变化
- 30. 如何找到最低成本?
此算法是否真的考虑到无界性? (每种类型都有无限数量)。我不太明白它是如何做的? – estan 2015-10-01 17:46:55