题目描述:一个射击运动员打靶,靶一共有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();
}
}