面试经典(12)--射击打靶问题

题目描述:一个射击运动员打靶,靶一共有10环,连开10 枪打中90环的可能的组合有多少种?

思路分析:每一枪的可能性都有11种,1-10靶或者脱靶,要遍历出每种可能。假设solve(n,sum)代表射击n枪,打中sum环的所有组合的可能。第一枪有11可能,假如第一枪打中i环,那么接下来只要计算solve(n-1.sum-i)环就可以,所以这明显是一个递归的解法。

关键是分析退出条件:sum<0或者10*n<sum,输出结果的条件:num==1且sum<=10

代码如下:

void shoot_solution(int num,int sum,vector<int> &result,int *total)
{
	if(sum<0 ||num*10<sum)
		return;
	if(num==1)
	{
		if(sum<=10)
		{
			for(int i=0;i<result.size();i++)
				cout<<result[i]<<" ";
			cout<<sum<<endl;
			(*total)++;
			return;
		}
		else
			return;
	}
	for(int i=0;i<=10;++i)
	{
		result.push_back(i);
		shoot_solution(num-1,sum-i,result,total);
		result.pop_back();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值