Question:
You are given an array that represents bills in certain currency (for example
1, 2, 5, 10) and an amount, for example17. You should output the number of possible combinations of bills that sum to the given amount.
Answer:
{2, 5, 10}
Can I optimize/improve below code? Current complexity is: O(2(n-1)), where n is the bill list length.
//Returns possible Bills List
public static List<Set<Integer>> possibleBills(Integer amount, int[] bills){
List<Set<Integer>> result = new ArrayList<Set<Integer>>();
if(amount < 0){
return null;
}
if(bills.length == 0){
return null;
}
if(amount-bills[0] == 0){
Set<Integer> set = new TreeSet<Integer>();
set.add(bills[0]);
result.add(set);
return result;
}
//Include 0'th bill and generate possible bills
List<Set<Integer>> result1 = possibleBills(amount - bills[0], Arrays.copyOfRange(bills, 1, bills.length));
if(result1 != null){
Iterator<Set<Integer>> result1Itr = result1.iterator();
while(result1Itr.hasNext()){
Set<Integer> set = result1Itr.next();
set.add(bills[0]);
}
result.addAll(result1);
}
//exclude 0'th bill and generate possible bills
List<Set<Integer>> result2 = possibleBills(amount, Arrays.copyOfRange(bills, 1, bills.length));
if(result2 != null){
result.addAll(result2);
}
if(result.size() == 0){
return null;
}
return result;
}