編程題目:
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;
}
}