问题:
给出无限数量的季度(25美分),角钱(10美分),镍币(5美分)和便士(1美分),计算代表n美分的方式数。
我的回答:
public static int generateComb(int n){
if(n < 0){
return 0;
}
if(n == 0){
return 1;
}
int ways = generateComb(n-25) + generateComb(n-10) + generateComb(n-5) + generateComb(n-1);
return ways;
}
请告诉我我的实施是否正确。
答案 0 :(得分:2)
一个解决方法是确保没有递归调用使用比上一次更大的硬币。
答案 1 :(得分:0)
谢谢大家......我能得到它:
public static int generateComb(int n, int denom){
int next_denom = 0;
switch(denom){
case 25:
next_denom = 10;
break;
case 10:
next_denom = 5;
break;
case 5:
next_denom = 1;
break;
case 1:
return 1;
}
int ways = 0;
for(int i = 0 ; i*denom <= n ; i++){
ways+= generateComb(n-i*denom, next_denom);
}
return ways;
}
答案 2 :(得分:0)
与您的解决方案相同,但略短,并支持任意面额。
private static int generateComb(int amount, Collection<Integer> denominations) {
if (amount == 0) return 1;
if (denominations.isEmpty()) return 0;
List<Integer> denominationsList = new ArrayList<Integer>(denominations);
Collections.sort(denominationsList, Collections.reverseOrder());
int currentDenomination = denominationsList.remove(0);
int ways = 0;
for (int total = 0; total <= amount; total += currentDenomination) {
ways += generateComb(amount - total, denominationsList);
}
return ways;
}
答案 3 :(得分:0)
另一种解决方案 -
int[] arr = {5, 3 , 1};
int sum = 10;
countNway(arr, sum, 0);
public int countNway(int[] arr, int sum, int start){
if(start>arr.length){
return 0;
}
if(sum==0){
return 1;
}
if(sum<0){
return 0;
}
int result =0;
for(int i= start;i<arr.length;i++){
for(int j = 1; j<=(sum/arr[i]); j++){
result += countNway(arr, sum -arr[i]*j, i+1);
}
}
return result;
}