当前位置: 首页 > 知识库问答 >
问题:

在流行的硬币变化动态编程问题中,遍历状态的正确顺序是什么?

欧阳安晏
2023-03-14

我在Hackerrank上解决了这个(https://www.hackerrank.com/challenges/coin-change/copy-from/188149763)问题,可以总结如下:

找到与给定的硬币面额集合交换某个值的总方法。

这是我被接受的代码:

long getWays(int n, vector<long> c) {
    long dp[n+1];
    memset(dp, 0ll, sizeof(dp));
    dp[0] = 1;
    for(int ci=1; ci<=c.size(); ci++)
    {
        for(int i=1; i<=n; i++)
        {
            if(c[ci-1] > i) continue;
            dp[i] += dp[i-c[ci-1]];
        }
    }
    return dp[n];
}

这里n是我们应该得到的总值,c是硬币的数组。我的问题是,如果我颠倒循环的顺序,也就是做类似的事情

long getWays(int n, vector<long> c) {
    long dp[n+1];
    memset(dp, 0ll, sizeof(dp));
    dp[0] = 1;
    for(int i=1; i<=n; i++){
        for(int ci=1; ci<=c.size(); ci++)
        {
            if(c[ci-1] > i) continue;
            dp[i] += dp[i-c[ci-1]];
        }
    }
    return dp[n];
}

为什么答案会改变?

共有1个答案

夹谷野
2023-03-14

第一个代码更新了使用新硬币组合值dp[i]方法。在第k轮外环之后,我们只有dp[]数组填充了k个硬币的组合,其余的硬币还没有使用。如果我们为排序的硬币列表输出组合本身,我们会看到像1 1 5-5这样的有序组合永远不会出现在1之前。

外环第m轮的第二个程序使用所有可能的硬币填充第m个单元格dp[m]。所以我们可以得到m=71 1 5和1 5 15 1-所有可能的排列。这就是为什么结果不同。

 类似资料:
  • 问题:我很难找到达到特定金额所需的最低硬币数量。我很确定这是最简单的递归方式,使用动态编程方法,我基本上应该得到Math.min(“获取ACoin”、“离开ACoin”);不幸的是,我的代码不会终止,尽管我确实有在满足总和的条件下终止的if语句,硬币数组耗尽,或者如果总和结束。请查看下面的代码,让我知道我做错了什么,特别是为什么我的代码继续执行,直到它收到一个stackoverflow错误,尽管我

  • 我目前正在尝试用Python实现动态编程,但我不知道如何设置回溯部分,使其不会重复排列。例如,一个输入应该是(6,[1,5]),预期的输出应该是2,因为有两种可能的方式来排列1和5,使它们的总和等于6。这些组合是{1,1,1,1,1}和{1,5}但是我的程序目前的工作方式,它考虑了上面显示的组合和组合{5,1}。这导致输出为3,这不是我想要的。所以我的问题是“如何防止重复排列?”。我当前的代码如下

  • 我的硬币兑换动态编程实现在一些测试用例中失败,我很难找出原因: 问题陈述:给定一个数量和一个硬币列表,找出制造该数量所需的最小硬币数量。 例如: 目标金额:63 硬币列表:[1,5,10,21,25] 输出:[21,21,21] 小装饰品:https://trinket.io/python/43fcff035e

  • 动态规划变更问题(有限硬币)。我正在尝试创建一个以以下内容作为输入的程序: 输出: 输出应该是大小为1的数组,其中每个单元格代表我们需要改变单元格索引量的最佳硬币数。 假设数组的单元格位于index: 5,内容为2。这意味着为了给出5(INDEX)的变化,您需要2(单元格的内容)硬币(最佳解决方案)。 基本上,我需要这个视频的第一个数组的输出(C[p])。这与有限硬币的大区别是完全相同的问题。链接

  • 这是uva问题的根源。在线法官。组织机构 这个问题基本上是说: 给定N笔必须给的钱!!我们需要找出我们能给多少最低硬币,以及这些硬币的总价值,这样使用n个给定面额给的额外金额就最小了! 例如: 我的问题是: 这里的重叠子问题是什么? 我的意思是: 有重叠的子问题吗<因为我找不到任何。。。

  • 这是我关于硬币更换问题的代码,用于打印一组硬币的总方式数和目标金额 我想知道是否有任何方法可以用相同的动态规划解决方案打印这些方法(借助内部构造的表或任何其他方法) 例如,如果一组硬币是[1,3,5],目标金额是6,那么总共有4种可能的方式。[1,1,1,1,1,1,1,],[1,1,1,3],[3,3],[1,5]]我希望这种方式的列表作为输出。