我想出了一种递归解决方案,以找到一组硬币面额的给定钱来更换硬币的最小数量。它工作正常,但我想扩展此算法以打印所有可能的方式来改变钱,但我做不到。
这是我的代码:
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;
}
我尝试制作一个列表列表,在其中存储了要进行调用的所有值,但无法将其放入代码中。
因此,请告诉我如何通过扩展这种方法来做到这一点。
答案 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]