【问题标题】:How to define and initialize a variable only once in a recursive function?如何在递归函数中只定义和初始化一次变量?
【发布时间】:2020-12-12 08:18:25
【问题描述】:

我正在尝试解决 GeeksforGeeks 上的 0/1 背包问题,它需要我完成功能

int knapSack(int W, int wt[], int val[], int n) 

现在我想用递归+记忆来做到这一点。但是为此我需要为每个测试用例定义和初始化一个 DP 矩阵。看起来像这样。

int dp[1001][1001];
memset(dp,-1,sizeof(dp));

现在我能想到的是全局定义矩阵并在函数内部使用 memset,但问题是 memset 会在每次递归调用时重置矩阵。有没有办法绕过它? 还是我只需要使用制表法?

【问题讨论】:

  • 你为什么使用1001?你认为memset-1 会做什么?我建议阅读good book 而不是这个完全不专业的网站。
  • memset 用 -1 初始化矩阵,由于限制,我使用 1001
  • 然后memset(dp, -2, ...)会用-2初始化它吗?
  • 没有 memset 只能取 0 或 -1,因为我听说过
  • 抱歉,但是这种方法在很多方面都被破坏了,因此需要很长的答案来解释一个好的解决方案可能是什么样子。以 GeeksForGeeksish 风格做这件事只是浪费时间。他们教的所有(int W, int wt[])dp[1001][1001]memset 都与专业的C++ 编程无关。不要从一开始就养成坏习惯,也不要在 Geeks 上浪费时间。

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


【解决方案1】:

避免全局变量。

拆分你的方法:

int knapSackRec(int (&dp)[1001][1001], int W, int wt[], int val[], int n)
{
    // ...
}

int knapSack(int W, int wt[], int val[], int n)
{
    int dp[1001][1001];
    memset(dp, -1, sizeof (dp));
    return knapSackRec(dp, W, wt, val, n);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 2013-06-04
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多