我在这里有我的代码,它旨在返回硬币的最小配置,以便为给定的金额进行更改。它有两个参数,总和和面额列表。我没有编译错误,程序可以提供输出,但我得到的并不完全正确。对此非常感谢任何帮助。
//this program calculates the minimum coins and distribution of
//denominations required to make change for a given sum
import java.util.*;
import java.io.*;
public class MinCoinCollectionBacktrack {
private int sum;
private List<Integer> coins;
//constructor that takes sum and list of denominations
//such as [1,5,10,25]
public MinCoinCollectionBacktrack(int amount,List<Integer> denominationList) {
sum=amount;
coins=denominationList;
}
//calculate the minimum coins
//uses map to store sum-->list of combinations
//eg 3-->[2,1], 4 -->[2,2] for a given denomination list of [1,2,5]
public List<Integer> Mincoins() {
Map<Integer, List<Integer>> lenChoices=new HashMap<Integer,List<Integer>>();
int maxdenomination=Collections.max(coins);
Integer sum1= new Integer(sum);
return minCoins(lenChoices,sum,maxdenomination);
}
//wrapper method for MinCoins, it takes a map and updates as when
//minimum configuration of a sum is found. stores the value
//as described above
private List<Integer> minCoins(Map<Integer, List<Integer>> lenChoices, int value,int maxdenomination) {
//check if sum is a key in map, then return its value
if (lenChoices.containsKey(value)) {
return lenChoices.get(value);
//check if the coinlist contains sum, if yes, it creates a
//new key value pair to the Map
} else if (coins.contains(value)) {
List<Integer> newlist = new ArrayList<Integer>();
newlist.add(value);
lenChoices.put(value,newlist);
return lenChoices.get(value);
//if the denomiation is > sum, just return empty list
} else if (maxdenomination > value) {
List<Integer> newlist = new ArrayList<Integer>();
lenChoices.put(value,newlist);
return lenChoices.get(value);
//here is where recursive backtracking happens
} else {
int minLength=0;
List<Integer> minConfig=new ArrayList<Integer>();
for (int coin : coins) {
List<Integer> results = minCoins(lenChoices,value - coin,maxdenomination);
if (!results.isEmpty()) {
if (minLength==0 || (1+results.size()) < minConfig.size()) {
results.add(coin);
minConfig=results;
minLength=minConfig.size();
}
}
}
lenChoices.put(value,minConfig);
return lenChoices.get(value);
}
}
public static void main(String[] args) {
System.out.println("enter the denoninations, hit enter to Zero(0) to finish");
Scanner console = new Scanner(System.in);
List<Integer> coinlist= new ArrayList<Integer>();
int input = console.nextInt();
while (input>0) {
coinlist.add(input);
input = console.nextInt();
}
System.out.println("coin collections are :"+ coinlist);
System.out.println("enter the sum for which you need minimum coins");
input = console.nextInt();
MinCoinCollectionBacktrack result=new MinCoinCollectionBacktrack(input,coinlist);
List<Integer> output = result.Mincoins();
System.out.println("you require " + output.size() + " coins in the"
+ " following combination " + output);
}
}
请随时评论风格和算法的潜在改进领域。谢谢!