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

当每种硬币只有一种可用时,修改了硬币交换问题

田兴怀
2023-03-14

给定一组面值和总数,我们必须找到使总数精确所需的最低硬币数量。

约束:每个面额的硬币只有一枚。

你如何比较贪婪方法和动态规划方法?

编辑:例如:我有面额为1、2、3、5的现金。我每种面额只有一枚硬币。我想用最少数量的硬币换11英镑的零钱。答案是4(1235)。如果我有无限量的每种面额,答案是3(551或533)。

共有2个答案

司寇山
2023-03-14

找到任何解,更不用说最大解,都被称为子集和问题。它是NP完全的,并且最有效的已知算法具有指数运行时间。

因此,贪婪算法不适用于此问题。您不会比某种回溯搜索做得更好。使用动态规划的解决方案实际上相当于回溯搜索,只是实现方式不同而已。因此,比较非常简短:贪婪不起作用,但动态规划可以。

慕兴平
2023-03-14

你如何比较贪婪方法和动态规划方法?

贪婪的方法在你的情况下会失败,因为你永远不知道什么时候该跳过或拿硬币来得到最好的答案。你必须尝试所有可能的解决方案,包括/排除每一枚硬币。

例如,您可以使用使用相同硬币变化算法的动态编程来实现这一点,但避免多次使用相同的硬币

递归自上而下方法:

int n = 4, k = 11;
int dp[4][12], coins[] = {1, 2, 3, 5};

int solve(int i = 0, int sm = k) {
    // base case for when the sum is reached
    if (sm == 0) {
        return 0;
    }
    // took more than needed coins or reached the end without reaching sum
    if (sm < 0 || i == n) {
        return 1000000000;
    }
    // check if dp value already calculated
    int& ret = dp[i][sm];
    if (~ret) {
        return ret;
    }
    // otherwise, try taking the coin or skipping it
    return ret = min(solve(i+1, sm), 1 + solve(i+1, sm-coins[i]));
}
int main() {
    memset(dp, -1, sizeof dp);
    cout << solve() << endl;
 return 0;
}
// output: 4
 类似资料:
  • 我对解决硬币交换问题的一种变体感兴趣。回想一下硬币交换问题的正式定义: 给定一个值N,如果我们想改变N分,并且我们有无穷多的S={S1,S2,…,Sm}整值硬币,我们有多少种方法可以改变?硬币的顺序无关紧要。例如,对于N=4和S={1,2,3},有四种解决方案:{1,1,1},{1,1,2},{2,2},{1,3}。所以输出应该是4。对于N=10和S={2,5,3,6},有五个解:{2,2,2,2

  • 具体而言,问题是: 给定面额数组<代码>硬币[],每个硬币的限制数组<代码>限制[]和数量<代码>金额,返回所需的最小硬币数量,以获取<代码>金额,或者如果不可能,返回空值。另外,用溶液中使用的每个硬币的数量填充数组 这是我的解决方案: 但它一般不起作用。 我的问题是,例如,在这种情况下: 最佳解决方案是: 并且我的算法给出作为结果。换句话说,它失败了,每当在某种情况下,我将不得不使用比可能的更少

  • 所以我对编码不熟悉,我得到了一个任务,我需要做一个程序,用四分之一、一角、五分和一美分给不到一美元的零钱。然而,作业希望程序打印所需的最低硬币数量(例如,如果我输入58美分,那么输出应该是“2个25美分,1个镍和3个便士”,而不是“2个25美分,0个10美分,1个镍和3个便士”。本质上,如果没有某种硬币,那么程序就不应该打印它)。我一直在想如何制作它,这样程序就不会打印任何不必要的硬币。 这就是我

  • 我们得到了一套面额和总额。 每种面额的无限硬币都可以买到 所有面额都是5的幂 我们必须找到总数所需的最低硬币数量。 我想知道解决方案背后的逻辑。提前感谢。

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

  • 我试图使用贪婪算法来计算在JavaScript中达到一定数量所需的最低硬币数量 返回结果将是一个数组,由每个级别的硬币数量组成 我决定做一个函数来解决这个问题,但它不起作用 calculateChange函数包含两个参数:硬币值数组和金额。 第一步是初始化一个sum变量,该变量显示已调度的更改量。我还将创建一个数组变量,该变量将保存某个硬币的分配次数。 为此,我将迭代coins数组并将所有值设置为