背包实现未正确填充。已经尝试调试好几天了。仍然在学习
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
-- 这一行没有初始化任何东西。它所做的只是声明一个二维数组,其中包含谁知道的值。如果你真的想将它初始化为0
:int 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<std::array<int, 7>, 4> R =
并使用at()
表明此处存在越界访问:R[i][j] = 0;
我们真的在这里吹毛求疵吗hhh 你是对的,尽管我只想指出数组可能具有未知的值,这会导致 min/max 函数的行为不同于我们希望它们的行为.
我指出代码具有未定义的行为。请注意,这是作为 *** 上的答案发布的——如果您有知识或有人让您知道代码具有未定义的行为,您至少应该在答案中提及它和/或诊断问题并编辑答案与更正。这是代码for reference。知道答案不起作用并没有错,但提到它不起作用。否则我们会让新手复制并粘贴答案,然后会感到失望。
不能再同意了。平心而论,我想展示一种使其工作的通用方法,但你是对的,我对其进行了一些更改。谢谢你指出以上是关于背包实现未正确填充。已经尝试调试好几天了。仍然在学习的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot真热部署不重启项目秒改sql已经爽了好几天了