Algorithm 背包问题-从5组物品中选择可能的最佳组合,包括每组1件物品

Algorithm 背包问题-从5组物品中选择可能的最佳组合,包括每组1件物品,algorithm,combinations,knapsack-problem,Algorithm,Combinations,Knapsack Problem,我有5个包含物品价值和物品价格的二维数组,它们如下所示 A = [ [1, 1], [2, 5], [3, 7], ... ] ... ... E = [ [4, 15], [12, 25], [33, 57], ... ] 第一列是项目价值,第二列是价格 我想要实现的是最终的一组5个值,其中每个项都来自不同的起始数组,因此最终结果应该是这样的,例如[A[1],B[15],C[46],D[3],e[0],所选元素的标准类似于背包

我有5个包含物品价值和物品价格的二维数组,它们如下所示

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

E = [
    [4, 15],
    [12, 25],
    [33, 57],
    ...
]
第一列是项目
价值
,第二列是
价格

我想要实现的是最终的一组5个值,其中每个项都来自不同的起始数组,因此最终结果应该是这样的,例如
[A[1],B[15],C[46],D[3],e[0]
,所选元素的标准类似于背包问题的标准-所有项目的最佳价值,同时将所选元素(第二列)的价格总和保持在给定的阈值下,例如500

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

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


2) 根据它创建性价比和订单项目,然后找到某种方法来找到近似的最佳解决方案

您可以使用动态规划来解决此问题

dp[i][j]
成为从第i个数组中选取元素后已使用
j
价格的最佳值

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])

for(int i=0;i Hi stetoc)我的解决方案对您有效吗?这个解决方案有点有效,但没有达到预期效果,我在项目中实现了它,但没有找到符合条件的组合
A+B+C+D+E≤ 500
,而是匹配
A≤ 500&B≤ 500&C≤ 500&D≤ 500&E≤ 500
,无法100%确定我在实现它时是否输入了一些错误或其他东西,将在不久的将来验证它,必须将这个东西留下,直到我找到空闲时间it@stetoc没问题,如果仍然发生这种情况,您可以提供代码,我可以帮助您调试:d此逻辑有缺陷。当您在每个第j个项集中循环p时,您将重量设置为0,这样重量就不是之前所有物品的总和,而是每套物品的总重量。@PuiHoLam你说得对,只是修正了它,谢谢!