【问题标题】:Getting list of selected items in Knapsack DP matrix获取背包 DP 矩阵中选定项目的列表
【发布时间】:2016-10-01 07:22:59
【问题描述】:

我已经尝试实现堆栈溢出Answered Solution。但它不起作用。

测试用例:

   int val[] = {10,40,30,50};
   int wt[] = {5,4,6,3};
     W = 10;

输出背包 DP 矩阵:

0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 5 5 5 5 5 5 
0 0 0 0 4 5 5 5 5 9 9 
0 0 0 0 4 5 6 6 6 9 10 
0 0 0 3 4 5 6 7 8 9 10 

可以达到的重量是:10

所选项目的重量总和:11 (错误应该只有10)

选中 -> 6(第 3 项)和 5(第 1 项)[这是错误的]

int knapSack(int W, int wt[], int val[], int n)
{
 int i, w;
 int K[n+1][W+1]; 
  int picks[n+1][W+1] = {0};
  // Build table K[][] in bottom up manner
  for (i = 0; i <= n; i++)
   {
   for (w = 0; w <= W; w++)
   {
       if (i==0 || w==0)
           K[i][w] = 0;
       else if (wt[i-1] <= w){
          //val[i-1 ] is value of curr i
             K[i][w] = max(wt[i-1] + K[i-1][w-wt[i-1]],  K[i-1][w]);
             if (val[i-1]+K[i-1][w-wt[i-1]] > K[i-1][w]){
                picks[i][w]=1;
             }
            else
                picks[i][w]=-1;
       }
       else{
        // wt of individual is > limit 
             picks[i][w] = -1; 
             K[i][w] = K[i-1][w];
    }
   }
  }
}

为了打印选择的元素,我正在使用

while (w > 0 && i > 0 ){

if ((K[i][w] - K[i-1][w-wt[i-1]]) == wt[i-1]){
    weight += wt[i-1];
    i = i - 1;
    w = w - wt[i-1];
}
else{
  i = i - 1;
}

}

【问题讨论】:

    标签: c++ algorithm dynamic-programming knapsack-problem


    【解决方案1】:
     w =  w - wt[i-1] 
    

    其实是

    w =  w - wt[i-2] 
    

    因为 i = i - 1 是在它之前计算的。 下面的代码现在可以工作了。

        weight += wt[i-1];
        i = i - 1;
        w = w - wt[i] ;
    

    【讨论】:

      猜你喜欢
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 2019-01-04
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多