凑硬币——武大机试真题
题目:使用{1,2,5}分的硬币凑1元钱,问共有多少种凑法?
注意1,1,2凑4分钱和2,1,1凑4分钱是一样的。
回溯法:
void backtracking(int sum,int startIndex,int &amount,vector<int> &coins){
if(sum==amount){
cnt++;
}
for(int i=startIndex;i<coins.size();i++){
if(sum+coins[i]>amount)break;//因为coins有序且是从小到大的,所以是break而不是continue。
else{
sum+=coins[i];
backtracking(sum,i,amount,coins);//每次传入参数i而不是i+1,且i的初值为startIndex,说明既可以重复使用coins[i],又不能去回头使用coins[i-1] 避免重复返回2+1=3和1+2=3的情况.
sum-=coins[i];
}
}
}
int main(){
vector<int> coins={1,2,5};
int amount;
cout<<"请输出目标数字(每分):";
cin>>amount;
int sum=0;
backtracking(sum,0,amount,coins);
cout<<"共有 "<<cnt<<" 种方法使用coins 凑得 "<<amount<<" 分";
return 0;
}

浙公网安备 33010602011771号