【问题标题】:Generate combinations for representing a number生成表示数字的组合
【发布时间】:2018-10-01 06:32:44
【问题描述】:

问题:

给定无限数量的四分之一 (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;
}

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

【问题讨论】:

  • 您的算法更多的是排列,其中 (1, 5) 与 (5, 1) 不同。
  • 你们能推荐一个方法吗..?

标签: java algorithm recursion


【解决方案1】:

一种解决方法是确保递归调用永远不会使用比上次使用的硬币更大的硬币。

【讨论】:

    【解决方案2】:

    谢谢大家..我能够得到它:

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

    【讨论】:

      【解决方案3】:

      方法与您的解决方案相同,但稍短一些,并支持任意面额。

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

      【讨论】:

        【解决方案4】:

        另一种解决方案-

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

        【讨论】:

          猜你喜欢
          • 2012-04-26
          • 2021-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多