【问题标题】:Knapsack for table餐桌背包
【发布时间】:2016-05-02 12:03:45
【问题描述】:

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

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

【问题讨论】:

标签: c# knapsack-problem


【解决方案1】:

据我了解,所描述的问题可以通过动态编程以与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])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 2019-02-15
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    相关资源
    最近更新 更多