如何在三列上应用背包算法

时间:2014-05-27 11:08:48

标签: java algorithm knapsack-problem

我有一个问题,例如以下要在java中实现。

item    Profit      Availability    Quality
1         20          6               55 
2         18          8               67 
3         16          7               70 
4         13          9               80 
5         17          8               85

我在这里有以上格式的数据。我希望获得利润,可用性和质量的价值。

目标是提供一个解决方案,该解决方案包含满足我所期望的利润,可用性和质量的项目。

我的方法:我必须应用一些算法。通过传递利润和可用性,最大可用性限制为M,例如M=10。现在它将给我一些项目作为我的解决方案的一部分。

现在我必须应用一些算法来获得上述算法实现的解决方案的最大质量值。我可以交换一些已包含在我的解决方案中的项目,以提高我的质量参数。但我必须确保这些修改不会大幅改变利润和可用性。如果有更好的解决方案,请建议。

1 个答案:

答案 0 :(得分:0)

使用背包方法的简单DP(使用最小利润边界优化最高质量):

int dp[N][MAX_PROFIT]; /// dp[i][j] - maximum quality obtained by using first i products which have j profit in total;
for (int i = 0; i < n; ++i) {
  for (int p = 0; p <= MAX_PROFIT; ++p) {
      for (int j = 0; j <= Available[j]; ++j) {
          int const newProfit = p + j * Profit[i];
          if (newProfit <= MAX_PROFIT)
              dp[i + 1][newProfit] = max(dp[i + 1][newProfit], dp[i][p] + j * Quality[i]);
      }
  }
}

然后从j >= minProfit找到dp[N][j]的最大值。