有六种不同面值的硬币 1分,2分,5分,1角,2角,5角,用找这六个不同面值的硬币组合成一元的,写一个方法得到组合的方案次数
这其实就是自然数拆分的算法,其实是一样的,只不过把数字换成了硬币面值并且面额固定。
下面的算法是自然数拆分的,你参考下吧。
[code="java"]
public class ChaiFenShu {
/**
* 存储拆分好的数字
*/
int store[] = new int[1000];
int Count = 0;
/**
*
* @param numberToSplit
* 需要拆分的数
* @param currentBit
* 拆分的进度
*/
public void SplitNumber(int numberToSplit, int currentBit) {
int restNumberToSplit;
for (int i = store[currentBit - 1] + 1; i <= numberToSplit; i++) { // 从比上一个拆分的数大1开始继续拆分
store[currentBit] = i; // 将这个数计入结果中
restNumberToSplit = numberToSplit - i; // 剩下的数是n-i
if (restNumberToSplit == 0 && currentBit > 1) { // 如果已经没有剩下的了,并且进度(总的拆分个数)大于1,说明已经得到一个结果。
increaseCount();
printCurrentSplit(currentBit);
} else {
SplitNumber(restNumberToSplit, currentBit + 1); //否则将剩下的数进行进度为m+1拆分。
}
store[currentBit] = 0; // 取消本次结果,进行下一次拆分。
}
//否则不进行拆分了
}
/**
* 增加计数
* @param currentBit
*/
private void increaseCount() {
Count++;
System.out.println();
}
private void printCurrentSplit(int currentBit){
for (int j = 1; j <= currentBit; j++) {
System.out.print(" " + store[j]);
}
}
public void print() {
System.out.println();
for (int i = 1; i < store.length && store[i] != 0; i++) {
System.out.print(" " + store[i]);
}
}
/**
* @param args
*/
public static void main(String[] args) {
ChaiFenShu chaiFenShu = new ChaiFenShu();
chaiFenShu.SplitNumber(15, 1);
chaiFenShu.print();
}
}
[/code]
[code="java"]for (int i = store[currentBit - 1] + 1; i <= numberToSplit; i++)[/code]
循环这里换成 1分,2分,5分,1角,2角,5角就可以了