编程题目:
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;
}
}