凑硬币——武大机试真题

题目:使用{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;
}
posted @ 2025-03-21 15:50  Cheauncey  阅读(51)  评论(0)    收藏  举报