动态编程中的核心转储错误

时间:2016-04-01 01:17:35

标签: c++ dynamic-programming memoization

我正在修改一个程序,该程序确定给定数量的更改所需的硬币数量最少。这个硬币系统只有三个硬币:0.01美元,0.06美元,0.10美元。因此对于13美分,如果硬币是3,则最小数量为3.对于56美分,最小数量是6,等等。程序执行该部分,我的部分是回溯跟踪备忘录表以确定每个使用的硬币的数量。例如,13美分最低为3硬币,硬币为2 6美分硬币和1美分硬币。

下面生成的备忘录表格如下:

1cent  0 1 2 3 4 5 6 7 8 9 10 11 12 13
6cent  0 1 - 3 - - - 2 - -  -  -  -  3
10cent 0 - - 3 - - - - - -  -  -  -  3

对于这样的事情,我们总是从右下角开始。我试图递归地做这件事。我注意到了一种模式。如果我们有一个数字,并且它上面的数字不是相同的数字,那么我们就跳过#34;在同一行cent个空格的左侧。所以在底行,10 cent行,最后我们看到从13跳到3,这是10个空格。如果一个数字和上面的数字是相同的数字,这意味着硬币在那之后停止使用多次,我们向上移动一行。因此,在上表中,我们从右下角3开始。上面的数字也是3,所以由于已经有0"跳跃",使用的10美分硬币的数量为0,我们向上移动到下一行,{{1行。

现在我们比较6 cent3。这两个数字不相等所以我们移过13个空格。因此,我们6"跳跃"截至目前。现在我们来看看12。这两个也不相等所以我们移动了7个更多空格,现在我们有6"跳跃"。现在我们比较21它们是相等的,所以我们向上移动一行并从那一点开始。因为我们有1"跳跃"在过去的一行中,使用的2个硬币的数量是6 cent。对于最后一部分,它会让人感到困惑。当我们向上移动时,我们从我们所在的同一列开始。由于我们正在比较21,我们将从该列继续。由于这是行1的最后一行,因此剩下的更改量始终是顶部的数字。在我的示例中,我们向上移动了一行并从0开始,因此使用的1硬币数量为1 cent。这意味着使用的硬币总数为:

1

我知道这是措辞非常混乱。希望我的代码能够更好地展示这一点。以下是我尝试实现此目的的方法:

 1 cent: 1
 6 cent: 2
10 cent: 0

这段代码编译,但是当我运行它时,我得到一条消息,说明" matrix.h:48:Object& Matrix :: at(uint,uint)[with Object = unsigned int; uint = unsigned int]:断言`row<行&& col< COLS'失败。 流产(核心倾销)"而且我不知道为什么。有谁知道为什么我会收到这个核心转储消息?

1 个答案:

答案 0 :(得分:0)

在尝试访问i和/或a之前,您需要检查0memo是否小于denom

void countCoins( uint i, uint a, uint coinVal,
                 const vector< uint > & denom,
                 Matrix< uint > & memo )
{
    if (i < 0) {
        // handle edge case and return
    }

    if (a < 0) {
        // handle edge case and return
    }

    uint numCoins = 0;

    ...
    ...

}

注意:如果ia的值大于memodenom的大小,则还需要检查它。但是在你的代码中,似乎你总是在递减它们,所以可能并非如此。