0-1 整数背包返回错误答案(动态规划)

Posted

技术标签:

【中文标题】0-1 整数背包返回错误答案(动态规划)【英文标题】:0-1 Integer Knapsack returning wrong answer (Dynamic Programming) 【发布时间】:2016-04-05 10:01:18 【问题描述】:

标题是不言自明的,我已经摆弄了几天了。我做错了什么愚蠢的事情?问题在于一堆重量相同的材料,因此没有值的输入向量,所以可能是我没有在 std::max 部分添加值,但我'我试过这样做,也没有得到正确的答案。 W是背包的容量,w是由物品的重量组成的向量。

#include <iostream>
#include <vector>

using std::vector;
using std::max;

int optimal_weight(int W, const vector<int> &w) 
     size_t size = w.size();
     int knapsack[size+1][W+1];

     for (size_t a = 0; a <= size; a++) 
         knapsack[a][0] = 0;
     

     for (int b = 0; b <= W; b++) 
         knapsack[0][b] = 0;
     

     for (size_t i = 1; i <= size; i++) 
          for (int j = 0; j <= W; j++) 
                   knapsack[i][j] = knapsack[i-1][j];

                   if (w[i-1] <= j) 
                          knapsack[i][j] = std::max(knapsack[i-1][j-w[i-1]], knapsack[i-1][j]);
                    

                
         
      return knapsack[size][W];
    

【问题讨论】:

你能给出一个示例输入、预期和实际输出吗?另外,你能提供一个minimal reproducible example吗? 【参考方案1】:

代码中的那一行:int knapsack[size][W+1]

应改为:int knapsack[size+1][W+1]

这是因为数组是从0 索引的,并且在上述情况下为0 to size-1 定义,并且您正在访问index = size 处的元素。 在计算std::max时还要加上相应的权重。

【讨论】:

背包数组错误是一个错字——当它是 [size+1] 时它仍然不起作用。但是,在 std::max 期间添加相应的权重是什么意思?我已经解释过这个程序中没有“价值”。还有什么我应该补充的吗?

以上是关于0-1 整数背包返回错误答案(动态规划)的主要内容,如果未能解决你的问题,请参考以下文章

动态规划算法之0-1背包问题

动态规划算法之0-1背包问题

动态规划算法之0-1背包问题

学界0-1背包问题的动态规划算法

0,1背包问题(动态规划)

0-1背包问题贪心算法动态规划