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

硬币兑换递归项目澄清

龙星渊
2023-03-14

我已经编写了一个代码,用来计算使用递归从1到100之间的任何值可以得到的更改可能性的数量。我不确定项目中的2个方法做了什么(代码中的粗体部分),所以有人能给我解释一下吗?我对Java还很陌生。

我包含了上下文的整个代码,但不确定是否有必要。

import java.util.Scanner;
import java.util.ArrayList;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Scanner keyboard = new Scanner(System.in);
        int[] coins = {1, 5, 10, 25};
        int answer = sc.nextInt();
        if (answer < 1 || answer > 100) {
            throw new IllegalStateException("Invalid value entered: " + answer);
        } else {
            System.out.println(findValue(answer, 0, coins));
        }

    }

    public static int findValue(int n, int current, int[] coins) {
        if (n >= 0 && n < 5) {
            return 1;
        }

        if (n < 0) {
            return 0;
        }

           **int num = 0;
        if (current == 0 && n % 5 != 0 && n > 5) {
            n -= n % 5;
        }

        for (int i = current; i < coins.length; i++) {
            num += findValue(n - coins[i], i, coins);
        }
        return num;**

    }

    public static boolean isNickelPossible(int n) {
        if (n >= 5) {
            return true;
        }
        return false;
    }

    public static int numNickels(int n) {
        int count = 0;
        if (n % 5 == 0) {
            return n / 5;
        }

        while (n - 5 >= 0) {
            n = n - 5;
            count++;
        }
        return count;
    }

    public static boolean isDimePossible(int n) {
        if (n >= 10) {
            return true;
        }
        return false;
    }

    public static int numDimes(int n) {
        int count = 0;
        if (n % 10 == 0) {
            return n / 10;
        }

        while (n - 10 >= 0) {
            n = n - 10;
            count++;
        }
        return count;
    }

    public static boolean isQuarterPossible(int n) {
        if (n >= 10) {
            return true;
        }
        return false;
    }

    public static int numQuarters(int n) {
        int count = 0;
        if (n % 25 == 0) {
            return n / 25;
        }

        while (n - 25 >= 0) {
            n = n - 25;
            count++;
        }
        return count;
    }
}

共有1个答案

孙宏壮
2023-03-14

你必须一行一行地走每一步。顺便说一句,我认为这个代码目前还不起作用。您可能需要考虑从让代码在不使用递归的情况下工作开始,然后在以后添加递归。

    // seed the current run with the number of coin being removed in this iteration
    int num = 0;
    // current == 0 translates to coins[0] which equals pennies
    // check to see if the number of coins is divisible by 5, because all the coins, other than pennies
    // are divisble by 5
    // the remainder is the number of pennies 
    if (current == 0 && n % 5 != 0 && n > 5) {
        // reduce the current value (n) by the number of pennies
        n -= n % 5;
    }

    // walk the array of available coins, from pennies to quarters and 
    // find the number of coins that can be removed after that value is decremented.
    for (int i = current; i < coins.length; i++) {
        num += findValue(n - coins[i], i, coins);
    }
    return num;
 类似资料:
  • 我在理解动态规划中的硬币兑换问题时遇到了一个小问题。简单地说,我必须用最少数量的硬币来兑换一笔钱。 我有n种面值为1=v1的硬币

  • 我编写的代码使用动态规划解决了基本的硬币兑换问题,并给出了进行兑换所需的最小硬币数量。但是我想把每个硬币的数量存储在最小的数字里。 我试图做的是初始化数组,就像散列一样,只要找到,它就会增加的数量,即。但这并不是我想要的方式,因为它每次发现对应于时都会添加硬币。因此,在最终答案中,数字不是硬币的最终计数。 代码如下:

  • 我试图自己解决LeetCode问题322。硬币兑换: 您将获得一个整数数组,表示不同面额的硬币,以及一个整数金额,表示总金额。 返回您需要的最少数量的硬币,以弥补该金额。如果这些硬币的任何组合都无法弥补这一数额,则返回-1。 你可以假设每种硬币的数量是无限的。 我似乎有一个错误,无法找出它。 我用DFS解决,基本上是说当目标达到0时,只需将所有的聚集在一个数组中,并动态地保持尽可能短的结果。这是问

  • 但是我们不能这样做吗:(是给定的可用硬币的排序集,和是它的下标,是给定的最高价值硬币) 我写的东西有什么问题吗?虽然解决方案不是动态的,但不是更有效吗?

  • 给定一个值N,如果我们想改变为N美分,并且我们有无限量的S={S1,S2,...,Sm}值的硬币,我们有多少种方法可以改变?硬币的顺序并不重要。不过还有一个额外的限制:你只能用正好是K的硬币换零钱。 例如,对于N=4,k=2和S={1,2,3},有两个解:{2,2},{1,3}。所以输出应该是2。 解决方案: 以上是递归解决方案。但是,我需要有关动态规划解决方案的帮助: 让表示与元素和硬币的总和。

  • 在硬币系统C={c1,c2,…ck}中,应改变给定的数量x,以使每个硬币ci具有给定的重量wi。我们想计算可能变化的总重量。两种变化是不同的,如果他们包含在不同的顺序相同的硬币。 如何给出上述问题的动态规划递归?我知道最小硬币兑换问题的递归(即C(x)=min{C(x-C)1 for x