67.货币组合问题

编程题目:

67.货币组合问题:计算对于1元钱,共有多少种组合方法(假设组合时可以使用的货币包括1元,5角,2角,1角,5分,2分,1分。比如,如果M为1分,则共有1种组合方法,即1分;如果M为2分,则共有2种组合方法,即2个1或1个2分),只要求返回组合方法的个数,不要求输出具体组合方式。

示例代码:

package program.calculation.exercise67;

/**
 * 67.货币组合问题:计算对于1元钱,共有多少种组合方法
 * (假设组合时可以使用的货币包括1元,5角,2角,1角,5分,2分,1分。
 * 比如,如果M为1分,则共有1种组合方法,即1分;如果M为2分,则共有2种组合方法,即2个1分或1个2分),
 * 只要求返回组合方法的个数,不要求输出具体组合方式。
 */

public class MoneyCombine {  
    public static void main(String[] args) {
		
    	System.out.println("示例(M为1分时):");
    	System.out.println(count(1, 1)+1);
    	System.out.println("示例(M为2分时):");
    	System.out.println(count(2, 2)+1); 

    	System.out.println("问题(M为1元,即100分时):");
        System.out.println(count(100, 100)+1);  
    	
	}
  
    //递归求组合方式数
    //add:加数,即可使用的货币分值
    //sum:和,即100分,1元,要达到的货币分值
    private static int count(int add, int sum) {  
    	
        if (add <= 1) {  
            return 0;  
        } else {  
            int number = sum/add; // 当前可取值的个数  
            int count = number;  
            for (int i=0;i<number;i++) {  
                count += count(getNextAdd(add), sum-(i*add));; 
                
            } 
            return count;  
        }  
        
    }  
  
    //获取下一个加数
    private static int getNextAdd(int add) {  
    	
    	int[] adds = {100, 50, 20, 10, 5, 2, 1 }; 
    	
        for (int i=0;i<adds.length;i++) {  
            if (add == adds[i]) {  
                return adds[i+1];  
            }  
        }  
        return 0; 
        
    }  
}

结果显示:

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章