打印所有可能的对以使用递归来换钱

时间:2019-07-14 10:06:24

标签: algorithm recursion

我想出了一种递归解决方案,以找到一组硬币面额的给定钱来更换硬币的最小数量。它工作正常,但我想扩展此算法以打印所有可能的方式来改变钱,但我做不到。

这是我的代码:

    static HashMap <Integer,Integer> map = new HashMap<>(); 
public static void main(String [] args)
{
    int money=75,coins [] = {1,5,6};
    System.out.println(rc(money,coins));
}

public static int rc(int money,int [] coins)
{
    if(money==0)
        return 0;
    int mincoins = Integer.MAX_VALUE;
    for(int i=0;i<coins.length;i++)
    {
        if(money>=coins[i])
        {
            int ncoins;
            if(map.containsKey(money-coins[i]))
                ncoins = map.get(money - coins[i]);
            else 
                ncoins = rc(money-coins[i],coins);
            map.put(money-coins[i], ncoins);
            if(ncoins+1<mincoins)
                mincoins = ncoins+1;
        }
    }
    return mincoins;
 }

我尝试制作一个列表列表,在其中存储了要进行调用的所有值,但无法将其放入代码中。

因此,请告诉我如何通过扩展这种方法来做到这一点。

1 个答案:

答案 0 :(得分:1)

每次在调用递归函数之前都将其添加到全局列表中。函数调用后,从列表中删除硬币。

如果您使用money = 0,则只需打印列表,因为它将告诉您必须减去哪些硬币才能达到0。

如果money < 0,则表示您过高,减去得太多,必须退后一步。

Ideone链接:https://ideone.com/aAQGdF

import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone{

    static List<Integer> seq = new ArrayList<Integer>();

    public static void rc(int money,int [] coins) {

        if(money < 0){
            return;
        }

        if(money==0){
             System.out.println(seq);
        }

        int mincoins = Integer.MAX_VALUE;
        for(int i=0;i<coins.length;i++) {
            seq.add(coins[i]);
            rc(money - coins[i], coins);
            seq.remove(seq.size() - 1);
        }
    }

    public static void main (String[] args) throws java.lang.Exception {
        int money=12,coins [] = {1,5,6};
        rc(money,coins);
    }

}

输出

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1, 5]
[1, 1, 1, 1, 1, 1, 5, 1]
[1, 1, 1, 1, 1, 1, 6]
[1, 1, 1, 1, 1, 5, 1, 1]
[1, 1, 1, 1, 1, 6, 1]
[1, 1, 1, 1, 5, 1, 1, 1]
[1, 1, 1, 1, 6, 1, 1]
[1, 1, 1, 5, 1, 1, 1, 1]
[1, 1, 1, 6, 1, 1, 1]
[1, 1, 5, 1, 1, 1, 1, 1]
[1, 1, 5, 5]
[1, 1, 6, 1, 1, 1, 1]
[1, 5, 1, 1, 1, 1, 1, 1]
[1, 5, 1, 5]
[1, 5, 5, 1]
[1, 5, 6]
[1, 6, 1, 1, 1, 1, 1]
[1, 6, 5]
[5, 1, 1, 1, 1, 1, 1, 1]
[5, 1, 1, 5]
[5, 1, 5, 1]
[5, 1, 6]
[5, 5, 1, 1]
[5, 6, 1]
[6, 1, 1, 1, 1, 1, 1]
[6, 1, 5]
[6, 5, 1]
[6, 6]