【问题标题】:Multiple-item bounded Knapsack algorithm多项有界背包算法
【发布时间】:2015-01-02 16:34:02
【问题描述】:

我有一个物品清单,每个物品都有价格 - 或者就背包问题而言,有重量。可购买物品的数量仅受预算限制,因此只要总花费不超过某个常数,就可以根据需要购买尽可能多的物品。我还有一个算法,它基于某些变量,告诉每个项目的利润有多大(即每个项目的价值)。所以基本上我有一个有界背包问题,额外条件是每件物品中有不止一个适合背包。

我想在这些条件下最大化利润。我知道没有有效的解决方案,但至少有一个可行的解决方案吗?

【问题讨论】:

  • 与标准背包具有相同复杂性的解决方案是否可行?
  • 需要一个大小为budget的dp数组,复杂度为O(budget*(size of item list))

标签: algorithm knapsack-problem


【解决方案1】:

如果我们的预算为 i,则设 dp[i] 为可赚取的最大利润。 cost[j] 表示 j 项的成本, p[j] 表示从中获得的利润。我假设给出了 cost[]profit[]。然后下面是c++中的代码。 (假设有 n 个项目)。

  int max_profit(int budget )
  {
       if(budget<=0)
         return 0;
       if(dp[budget]!=-1)return dp[budget];
       int ans=0;
       for(int i=0;i<n;i++)
       {
             if(cost[i]<=budget)
               ans=max(ans,profit[i]+max_profit(budget-cost[i]));
       }
       dp[budget]=ans;
       return ans;
  }
  memset(dp,-1,sizeof(dp));
  cout<< max_profit(budget);

时间复杂度为 O(budget*(size of item list )),内存 O(budget)。我也假设一切 适合 int。

【讨论】:

  • 我认为应该是cost[i] &lt;= budget,而不是cost[i] &gt;= budget
  • 应该仍然检查budget &lt;= 0而不是budget == 0,即使在函数内部你只调用cost[i] &lt;= budget,因为第一次调用可能带有负值,这可能导致段错误。
  • @AndyG 初始预算为负是没有意义的,除此之外预算永远不会是 -ve,但仍然包含它,谢谢
  • @migdal:同意荒谬的部分。如果我学到了一件事,那就是保护用户免受他们自己的伤害,即使我是用户。
  • 是的,我同意代码应该处理这些事情的部分(y)
猜你喜欢
  • 2013-04-06
  • 1970-01-01
  • 2015-11-14
  • 2022-01-17
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
相关资源
最近更新 更多