背包实现未正确填充。已经尝试调试好几天了。仍然在学习

Posted

技术标签:

【中文标题】背包实现未正确填充。已经尝试调试好几天了。仍然在学习【英文标题】:Knapsack implementation not filling correctly. Have tried debugging for days now. Still learning 【发布时间】:2021-05-08 18:29:12 【问题描述】:

Visualiazation of code execution 当我将它加载到可视化器中时,我的表格没有正确填充这个背包问题变化的最小值到底是什么问题?我意识到这似乎是一个懒惰的问题,但我已经花了好几天的时间,不知道出了什么问题。我还在学习。

#include<iostream> 
using namespace std;
void Minwater(int w[],int p[],int T,int n)/// Assumes n is last element of w[]

    int R[4][7];//Initialize array of n+1 row and T+1 cols
    for(int i = 0; i <= n+1; i++)
    
        for(int j = 0; j <= T+1; j++)
        
            if (i == 0 || j == 0)
                R[i][j] = 0;
            else if (w[i - 1] <= j)
                R[i][j] = min(p[i - 1] + R[i - 1][j - w[i - 1]],R[i - 1][j]);
            else
                R[i][i] = R[i - 1][j];
       
        
      cout<< R[n][T];
    
  


int main() 
  int w[3]=1,2,3;
  int T=6;
  int p[3]=10,15,40;
  Minwater(w,p,T,4);
  return 0;


该表假定取两个值中的最小值 min(p[i - 1] + R[i - 1][j - w[i - 1]],R[i - 1][j]) 但我似乎用全零填充它,并且整个表最终都没有填充。

【问题讨论】:

int R[4][7];//Initialize array of n+1 row and T+1 cols -- 这一行没有初始化任何东西。它所做的只是声明一个二维数组,其中包含谁知道的值。如果你真的想将它初始化为0int R[4][7] = ; 我花了几天时间,不知道哪里出了问题。 -- 如果你使用std::array而不是常规数组,你就可以在几分钟内发现问题,也许是几秒钟,而不是几天。 See this。您拥有越界访问权限。现在您知道导致问题的原因和解决方法了 - 一切尽在您的掌握之中。 下标被颠倒了,但即使是the same error occurs。 【参考方案1】:

首先我认为我们不应该在i == 0 时访问i - 1,这会导致不需要的行为,所以最好设置R[i][j] = 0 when i == 0

我也改为 max 因为如果你想使用 min 你应该将所有值设置为某个无穷大,否则 0 将是整个网格中的默认值

还要确保您的网格 R 未初始化为某个值,以便最大操作可以确定(我添加了 = 0 只是为了表明我们希望所有都等于零,您可能需要一个 for 循环来初始化所有它)

#include<iostream> 
using namespace std;
void Minwater(int w[],int p[],int T,int n)/// Assumes n is last element of w[]

    int R[4][7] = 0;//Initialize array of n+1 row and T+1 cols
    for(int i = 0; i <= n; i++)
    
        for(int j = 0; j <= T; j++)
        
            if (i == 0)
                R[i][j] = 0;
            else if (w[i - 1] <= j)
                R[i][j] = max(p[i - 1] + R[i - 1][j - w[i - 1]],R[i - 1][j]);
            else
                R[i][i] = R[i - 1][j];
       
        
      cout<< R[n][T];
    
  


int main() 
  int w[3]=1,2,3;
  int T=6;
  int p[3]=10,15,40;
  Minwater(w,p,T,4);
  return 0;

【讨论】:

你可能想要一个 for 循环来初始化所有这些 -- 从技术上讲,使用 for 循环不是初始化 -- 它是 赋值我>。赋值不同于初始化。 更改为std::array&lt;std::array&lt;int, 7&gt;, 4&gt; R = 并使用at() 表明此处存在越界访问:R[i][j] = 0; 我们真的在这里吹毛求疵吗hhh 你是对的,尽管我只想指出数组可能具有未知的值,这会导致 min/max 函数的行为不同于我们希望它们的行为. 我指出代码具有未定义的行为。请注意,这是作为 *** 上的答案发布的——如果您有知识或有人让您知道代码具有未定义的行为,您至少应该在答案中提及它和/或诊断问题并编辑答案与更正。这是代码for reference。知道答案不起作用并没有错,但提到它不起作用。否则我们会让新手复制并粘贴答案,然后会感到失望。 不能再同意了。平心而论,我想展示一种使其工作的通用方法,但你是对的,我对其进行了一些更改。谢谢你指出

以上是关于背包实现未正确填充。已经尝试调试好几天了。仍然在学习的主要内容,如果未能解决你的问题,请参考以下文章

使用matlab进行洪水填充

SpringBoot真热部署不重启项目秒改sql已经爽了好几天了

给定最终块未正确填充

手机自动复制淘口令是啥情况?已经好几天了,手机自动复制淘口令,打开淘宝就自动弹出。

循环中的 RadioListTile Flutter

expo React-native 数据未呈现但登录控制台