Java 打印用于制作给定数量的硬币

Java 打印用于制作给定数量的硬币,java,algorithm,recursion,coin-change,Java,Algorithm,Recursion,Coin Change,我试图使用递归来找到最小数量的硬币,使给定的数额。我有代码可以列出所需的最小硬币数量,但我似乎找不到一种方法来打印出解决方案中使用了哪些硬币。我已经搜索并找到了类似的例子,但我似乎无法正确地将其应用于此 以下是我迄今为止所做的: import java.util.*; public class Coins{ public static int findMinCoins(int[] currency, int amount) { int i, j, min, tempS

我试图使用递归来找到最小数量的硬币,使给定的数额。我有代码可以列出所需的最小硬币数量,但我似乎找不到一种方法来打印出解决方案中使用了哪些硬币。我已经搜索并找到了类似的例子,但我似乎无法正确地将其应用于此

以下是我迄今为止所做的:

import java.util.*;

public class Coins{

    public static int findMinCoins(int[] currency, int amount) {
        int i, j, min, tempSolution;

        min = amount;

        for (i = 0; i < currency.length; i++) {
            if (currency[i] == amount) {
                return 1;
            }
        }

        for (j = 1; j <= (amount / 2); j++) {
            tempSolution = findMinCoins(currency, j) + findMinCoins(currency, amount - j);
            if (tempSolution < min) {
                min = tempSolution;
            }
        }
        return min;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int[] USA =
        {1, 5, 10, 25, 50};
        System.out.println("Please enter an integer amount.");
        int amount = in.nextInt();
        int minCoins = findMinCoins(USA, amount);
        System.out.println("The minimum number of coins to make " + amount + " in United States currency is " + minCoins + ".");
        System.out.println("The coins used were:");
        /*Print coins used to find minCoins.*/
        in.close();
    }
}
Please enter an integer amount.
17
The minimum number of coins to make 17 in United States currency is 4.
The coins used were:

如果有人能给我一些关于如何做到这一点的见解,我将不胜感激。

我认为这完全符合你想要实现的目标。只需调用
public static int findMinCoins(arg1,arg2)
它就会输出最小数量的硬币以及使用递归算法使用的所有特定硬币(它会显示其出现次数的倍数)

public static int findMinCoins(int[] currency, int amount) {
    int min = findMinCoins(currency, amount, 0);
    System.out.print("The coins used were: ");
    return min;
}
private static int findMinCoins(int[] currency, int amount, int min){
    int number, value1, value2;
    int min1 = min;
    for(int i=currency.length-1; i>=0; i--) {
        if (amount>=currency[i]){
            amount = amount - currency[i];
            System.out.print(currency[i] + " ");
            min1 = findMinCoins(currency, amount, min1);
            return ++min1;
        }
    }
    return min1;
}

在这里,您有一个测试,函数如下。请注意,不会处理边缘情况,例如空货币或负金额

假定货币数组已排序。如果没有,请使用
数组进行排序。排序(货币)

另外,不需要使用此方法进行递归;)

这是一个递归代码(正在工作,但需要修复…)。 其思想是使用所有硬币{1,5,10,25,50}进行传递和数组,并从左到右递归调用(直到数组结束)

注:

输出中有一个小错误

数字作为1个元素的数组传递,而不是原语int。(这是为了有一个引用类型,以便在所有递归调用中保持其值:

public class coins {

    public static void main(String[] args) {
        // arrays of coin types
        int[] coinTypes = { 0, 1, 5, 10, 25, 50 };
        // arrays are references, so changing them
        // inside the recursive function will 'really' change
        int[] price = {11}; // sample input
        tryBigger(price, coinTypes, 0);
    }

    // tries to see if higher coin is possible by passing array
    // of coin types and recursively call until the end of array
    public static void tryBigger(int[] price, int[] theCoins, int index) {
        if (index < theCoins.length-1){
            // until last element
            if (price[0] > theCoins[index]){
                tryBigger(price, theCoins, ++index);
            }
        }
        // find amount of this coin
        int thisCoin = price[0]/theCoins[index];
        // remove the amount already got before
        price[0] = price[0] - thisCoin*theCoins[index];
        System.out.println(thisCoin + " coins of " + theCoins[index]);
        return;

    }
}
公共等级硬币{
公共静态void main(字符串[]args){
//硬币类型数组
int[]coinTypes={0,1,5,10,25,50};
//数组是引用,因此更改它们
//递归函数的内部将“真的”改变
int[]price={11};//示例输入
tryBigger(价格,铸币类型,0);
}
//尝试通过传递数组来查看是否有可能获得更高的硬币
//并递归调用,直到数组结束
公共静态void tryBigger(int[]价格,int[]货币,int指数){
如果(索引<中心长度-1){
//直到最后一个元素
如果(价格[0]>Coins[指数]){
tryBigger(价格、货币、++指数);
}
}
//找出这枚硬币的数量
int this coin=价格[0]/币[指数];
//删除之前已获得的金额
价格[0]=价格[0]-这枚硬币*硬币[指数];
System.out.println(此硬币+硬币中的硬币+硬币[索引]);
返回;
}
}

在您提供的代码中,数字
1
min
由递归函数返回。使用此方法,您可以通过更改返回变量来获得硬币列表,以同时包含硬币和计数

这里是一个总体思想的示例;因为我不知道如何用Java编程,所以我将把实现留给您

if (currency[i] == amount){
    return [1,i];

...

temp1 = findMinCoins(currency,j);
temp2 = findMinCoins(currency,amount - j);

if(temp1[0] + temp2[0] < min[0]){
    min = [temp1[0] + temp2[0]] concatenated with temp1[1..] and temp2[1..]
if(货币[i]==金额){
返回[1,i];
...
temp1=findMinCoins(货币,j);
temp2=findMinCoins(货币,金额-j);
if(temp1[0]+temp2[0]
我正在研究类似的东西,这就是我想到的。你可以将使用过的硬币放在一个单独的数组中,并让助手函数递归打印最后使用过的硬币。如果你想返回一个列表或字符串,你可以让助手创建并返回一个

/**
*找到最小数量的硬币进行更改,更改值为:1、2、5、10、20、50、100、200
*
*@param更改我们需要提供的更改量
*@返回使用的最小硬币数量
*/
公共静态int MinimumberOfCoinToMoreKeChange(int change){
int[]面额={1,2,5,10,20,50,100,200};
int[]dp=新的int[change+1];
int[]原点=新int[change+1];
dp[0]=0;
对于(int i=1;i 0){
打印路径(原点);
}
}

在本例中,我硬编码了面额数组,但您应该能够将其删除并将另一个作为参数传递。这不是最有效的方法,但可能对像我这样刚刚进入动态编程的人有所帮助。干杯!

可用硬币是什么?另外,请尝试描述它应该如何工作-当前某些输入的代码永远运行(例如ie-44)质量方面的侧记:请考虑源代码中的命名。这是很糟糕的。首先,有约定;例如类名开始大写。然后:名字应该说出它所命名的东西。所以,数字是一个数字,并值一个值……嗯?对于实际问题,你可能想在这里开始使用PrrtLNS。e…只是打印中间结果;这可能会给你一个线索…在哪里以及如何添加相关的打印输出。@chenchuk可用的硬币可以是任何一组整数。对于我发布的代码,我只使用了{1,5,10,25,50}。至于结果,它打印出字符串“以美国货币制作17枚硬币的最小数量是4。”如果输入了17。我不知道如何在不使用动态编程的情况下用更高的值改进运行时。@Jägermeister好的,我在编辑中修复了一些质量问题,如果您看到其他问题,请不要犹豫,因为我正在尝试使代码更清晰。至于添加println,我尝试制作一个列表来存储每个v货币价值[i]在第一个for循环中,我没有取得任何进展。除此之外,我花了时间逐行调试,但我仍然不知道从哪里开始。@Sigonious你不需要使用递归,请看下面我的答案。它有测试证明它是有效的。如果货币数组的大小发生变化,这将不起作用。@GáborLipták现在请让你的手腕痛一点请删除否决票并提供我的答案一些积极反馈!@Mr.Robot我没有做出任何否决票。我不是有意冒犯,
if (currency[i] == amount){
    return [1,i];

...

temp1 = findMinCoins(currency,j);
temp2 = findMinCoins(currency,amount - j);

if(temp1[0] + temp2[0] < min[0]){
    min = [temp1[0] + temp2[0]] concatenated with temp1[1..] and temp2[1..]