从面值为 1,4,12,21的钱币中最多取五张,产生1~n的连续的数目,问这个n有多大(华为)
//回溯法来求解这个问题
int[] money = new int{0,1,4,12,21};
int num = 5;//五张
boolean find = false;//是否找到
int[] log = new int[num];//记录选择了哪几张,最多五张
public boolean comable(int n,int value){
//从剩下n张钱币中组合出价值value
if(n>=0&& value==0){
//还有钱币可以选择,且已经组合出了所需要的值,打印
find = true;
int sum = 0;
for(int i = 0;i<5&&log[i]!=0;i++){
sum += money[log[i]];
System.out.print(money[log[i]]+" , ");
}
System.out.println("总数为:"+sum);
}else
//&&!find用来废除结果一样只是顺序不一样的结果
for(int j = 0;j<5&&!find&&n>0;j++)
if(value-money[j])>0){
log[k++] = j;
comable(n-1,value-money[j]);
log[--k] = 0;
}
return find;
}
//如何调用
for(int i=1;comable(5,i);i++,find = false);