桌背包

时间:2016-05-02 12:03:46

标签: c# knapsack-problem

我有一个我无法解决的问题。有这个表:

table

我必须在五种产品中优化分配100万美元。我觉得它看起来像背包问题,但我不确定。如果我想解决这个问题,我应该看看什么?如果它是背包我应该如何更改原始的背包解决方案以适应我的问题?

1 个答案:

答案 0 :(得分:0)

据我所知,所描述的问题可以通过动态编程以与0/1 Knapsack Problem非常相似的方式解决。但是,必须调整递归关系。不考虑每个阶段的2个案例(即丢弃或采取相应的项目),必须考虑6个案例,相当于丢弃项目(不投资产品),选择1(使用投资1)做出选择10(使用投资10)。虽然每个项目将有11个利润值(对于每个选项),状态空间仍然是二维的(最小权重的一个轴,即投资金额,以及项目枚举的一个轴)。更详细地,伪代码的制剂可以如下。为了便于呈现,在状态空间之外的访问应该产生正无穷大的值。

// Input:
// Values (stored in array v_1,...,v_10)
// Weights (stored in arrays w_1,...w_10)
// Number of distinct items (n)
// Knapsack capacity (W)

for j from 0 to W do:
    m[0, j] := 0

for i from 1 to n do:
    for j from 0 to W do:
        m[i, j] := max(m[i-1, j],
                       m[i-1, j-w_1[i-1]] + v_1[i-1],
                       ...,
                       m[i-1, j-w_10[i-1]] + v_10[i-1])