首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成表示数字的组合

生成表示数字的组合
EN

Stack Overflow用户
提问于 2013-01-13 02:39:58
回答 4查看 692关注 0票数 2

问题:

给定无限数量的四分之一(25美分)、一角硬币(10美分)、五分币(5美分)和便士(1美分),计算表示n美分的方式。

我的答案是:

代码语言:javascript
复制
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;
}

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

EN

回答 4

Stack Overflow用户

发布于 2013-01-13 02:57:59

一种解决办法是确保没有递归调用使用比上一次使用的硬币更大的硬币。

票数 2
EN

Stack Overflow用户

发布于 2013-01-13 03:32:18

谢谢各位.我拿到了:

代码语言:javascript
复制
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;
}
票数 0
EN

Stack Overflow用户

发布于 2013-01-13 04:07:49

与您的解决方案相同,但稍微短一些,并且支持任意的分母。

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14300149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档