【问题标题】:Knapsack problem - selecting best possible combination of items from 5 sets including 1 item from each set背包问题 - 从 5 组中选择最佳可能的项目组合,包括每组 1 项
【发布时间】:2019-11-06 15:27:37
【问题描述】:

我有 5 个包含商品价值和商品价格的二维数组,它们看起来像这样

A = [
    [1, 1],
    [2, 5],
    [3, 7],
    ...
]
...
...

E = [
    [4, 15],
    [12, 25],
    [33, 57],
    ...
]

第一列是项目value,第二列是price

我想要实现的是最后一组 5 个值,其中每个项目将来自不同的起始数组,所以最终结果应该看起来像例如@ 987654324@,所选元素的标准有点像背包问题的标准 - 所有项目的最佳价值,同时将所选元素的价格总和(第二列)保持在给定的阈值下,例如500

我怎么能接近它?我真的不知道如何以正确的方式做到这一点,对我来说主要问题是我必须从每组中选择一个项目并最大化输出,或者也许有比背包解决方案更好的方法来解决这个问题?目前我能想到的只有

1) 预先计算给定参数的所有可能结果并缓存它们

2) 创建性价比并以此为依据订购商品,然后想办法找到近似最佳解决方案

【问题讨论】:

  • 嗨 stetoc 我的解决方案对你有用吗?

标签: algorithm combinations knapsack-problem


【解决方案1】:

你可以使用动态规划来解决这个问题。

dp[i][j] 成为最佳值,j 价格在从第 i 个数组中选择一个元素后已经使用。

for (int i = 0; i <= 5; i++)
  for (int j = 0; j <= 500; j++)
    dp[i][j] = -1;

dp[0][0] = 0;

for (int i = 1; i <= 5; i++) { // From array A to array E
  for (int j = 0; j < size_of_ith_array; j++) {
    for (int p = 0; p <= 500; p++) {
      if (p >= price[i][j] && dp[i - 1][p - price[i][j]] != -1)
        dp[i][p] = max(dp[i - 1][p - price[i][j]] + value[i][j], dp[i][p]);
      if (p >= price[i][j] && dp[i][p - price[i][j] != -1)
        dp[i][p] = max(dp[i][p - price[i][j]] + value[i][j], dp[i][p]);
    }
  }
}

ans = max(dp[5][0 to 500])

【讨论】:

  • 这个解决方案有点工作,但不像预期的那样,我在我的项目中实现了它,但它没有找到匹配条件 A+B+C+D+E ≤ 500 的组合,而是匹配 A ≤ 500 &amp;&amp; B ≤ 500 &amp;&amp; C ≤ 500 &amp;&amp; D ≤ 500 &amp;&amp; E ≤ 500,不是 100% 确定我是否在实现它或其他东西时犯了一些错字,将在不久的将来验证它,不得不离开这个东西,直到我找到空闲时间
  • @stetoc 没问题,如果仍然发生,您可以提供代码,我可以帮助您调试:D
  • 这个逻辑是有缺陷的。当您在每 j 组项目中循环 p 时,您将权重重置为 0,因此权重不是所有先前项目的总和,而只是每组的总重量。
  • @PuiHoLam 你说得对,刚刚修好了,谢谢!
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
相关资源
最近更新 更多