• 打靶问题


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

    分析:可通过递归算法来进行求解,运动员在射击的过程中,每次射击有11种可能:命中1环到10环之间的环数,或者脱靶。只要最后一靶只差10环以内,则此次射击有效,进行输出。

     代码实现如下:

       

     1 //函数功能 : 求解number次打中sum环的种数
     2 //函数参数 : number为打靶次数,sum为需要命中的环数,result用来保存中间结果,total记录种数 
     3 //返回值 :   无
     4 void ShootProblem_Solution(int number, int sum, vector<int> &result, int *total)
     5 {
     6     if(sum < 0 || number * 10 < sum) //加number * 10 < sum非常重要,它可以减少大量的递归,类似剪枝操作
     7         return;
     8     if(number == 1) //最后一枪
     9     {
    10         if(sum <= 10) //如果剩余环数小于10,只要最后一枪打sum环就可以了
    11         {
    12             for(unsigned i = 0; i < result.size(); i++)
    13                 cout<<result[i]<<' ';
    14             cout<<sum<<endl;
    15             (*total)++;
    16             return;
    17         }
    18         else
    19             return;
    20     }
    21     for(unsigned i = 0; i <= 10; i++) //命中0-10环
    22     {
    23         result.push_back(i);
    24         ShootProblem_Solution(number-1, sum-i, result, total); //针对剩余环数递归求解
    25         result.pop_back();
    26     }
    27 }
    28 //提供的公共接口
    29 void ShootProblem(int number, int sum)
    30 {
    31     int total = 0;
    32     vector<int> result;
    33     ShootProblem_Solution(number, sum, result, &total);
    34     cout<<"total nums = "<<total<<endl;
    35  }
  • 相关阅读:
    GitHub里的Hello World!
    4 款消息队列软件产品大比拼(转)
    .net常用组件
    Dapper.NET使用(转)
    设置MYSQL允许用IP访问
    test1
    SQLServer 2008以上误操作数据库恢复方法——日志尾部备份(转)
    Quartz.NET配置
    Quartz CronTrigger配置
    Quartz CronTrigger最完整配置说明
  • 原文地址:https://www.cnblogs.com/Trony/p/2621138.html
Copyright © 2020-2023  润新知