生成表示数字的组合

时间:2013-01-13 02:39:58

标签: java algorithm recursion

问题:

  

给出无限数量的季度(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;
}

请告诉我我的实施是否正确。

4 个答案:

答案 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;
}