码迷,mamicode.com
首页 > 其他好文 > 详细

打靶问题

时间:2014-07-26 03:32:27      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:os   io   for   re   c   问题   ar   amp   

/**
打靶问题:一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能性有多少?

思路:这道题的思路与字符串的组合很像,用递归解决。
一次射击有11种可能,命中1环至10环,或脱靶。
*/

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>

using namespace std;

//函数功能 : 求解number次打中sum环的种数
//函数参数 : number为打靶次数,sum为需要命中的环数,result用来保存中间结果,total记录种数
void ShootProblem_Solution(int number, int sum, vector<int> &result, int &total)
{
    if(sum < 0 || number * 10 < sum) //加number * 10 < sum非常重要,它可以减少大量的递归,类似剪枝操作
        return;
    if(number == 1) //最后一枪
    {
        if(sum <= 10) //如果剩余环数小于10,只要最后一枪打sum环就可以了
        {
            for(unsigned i = 0; i < result.size(); i++)
                cout<<result[i]<<‘ ‘;
            cout<<sum<<endl;
            total++;
            return;
        }
        else
            return;
    }
    for(unsigned i = 0; i <= 10; i++) //命中0-10环
    {
        result.push_back(i);
        ShootProblem_Solution(number-1, sum-i, result, total); //针对剩余环数递归求解
        result.pop_back();
    }
}

void ShootProblem(int number, int sum)
{
    int total = 0;
    vector<int> result;
    ShootProblem_Solution(number, sum, result, total);
    cout<<"total nums = "<<total<<endl;
}

int main()
{
    ShootProblem(10, 90);
    return 0;
}


打靶问题,布布扣,bubuko.com

打靶问题

标签:os   io   for   re   c   问题   ar   amp   

原文地址:http://my.oschina.net/gaosheng/blog/294975

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!