打靶问题

/**
打靶问题:一个射击运动员打靶,靶一共有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;
}

打靶问题

时间: 2024-10-11 01:52:37

打靶问题的相关文章

为什么知乎上很多人都反对创业?(上战场的士兵如果先拿枪打打靶练练枪法,研究研究战术之后,战损比肯定要更好看一点)

为什么知乎上很多人都反对创业? 经常看到一些排名靠前的答案,内容无非规劝他人不要创业,要脚踏实地,认为党和国家大众创业万众创新的政策方针都是胡扯?难道知乎上的知识分子们竟比国家的智囊更有远见?还是他们的认识层次达不到? 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:唐缺链接:https://www.zhihu.com/question/37559307/answer/72755062来源:知乎 -------------------------------------

递归计算战士打靶S次打了N环一共有多少种可能的问题

问题描述 一个战士打了10次靶,一共打了90环,问一共有多少种可能,并输出这些可能的组合. 思路 首先,嵌套10层循环进行穷举是不可取的,一是因为速度太慢,二是如果改成打20次靶就完蛋了. 其实这就是一个树的搜索问题. 1. 设第一次打了0环,那么第二次可能打0 ~ 10环这些可能 2. 以第一次打的0环为root,将第二次所有可能的环数都做为root的子结点 3. 重复1, 2步 这样就构成了一棵树,表示当第一次打了0环时所有的可能性.我们要做的就是从上到下遍历这棵树,当经过的结点之和等于90

【算法】打靶问题求解

问题描述:打一枪可能的环数为0~10,求打10枪总环数为90的概率. 这是一道排列组合问题,可以用循环加递归的方法解决.比如,第一次可以打出0~10环,那么先固定第一次打的环数,然后加上剩下的九次打的环数,就得到总环数.而剩下九次的环数通过递归很容易求得.代码如下: #include <iostream> using namespace std; int cnt = 0; int target = 90; void Permutation(int *numbers, int index, in

递归解决战士打靶N坏一共有多少种可能的问题

问题描述 一个战士打了10次靶,一共打了90环,问一共有多少种可能,并输出这些可能的组合. 思路 首先,嵌套10层循环进行穷举是不可取的,一是因为速度太慢,二是如果改成打20次靶就完蛋了. 其实这就是一个树的搜索问题. 1. 设第一次打了0环,那么第二次可能打0 ~ 10环这些可能 2. 以第一次打的0环为root,将第二次所有可能的环数都做为root的子结点 3. 重复1, 2步 这样就构成了一棵树,表示当第一次打了0环时所有的可能性.我们要做的就是从上到下遍历这棵树,当经过的结点之和等于90

2016蓝桥杯决赛C/C++A组第三题 打靶

题意: 小明参加X星球的打靶比赛.比赛使用电子感应计分系统.其中有一局,小明得了96分. 这局小明共打了6发子弹,没有脱靶.但望远镜看过去,只有3个弹孔.显然,有些子弹准确地穿过了前边的弹孔. 不同环数得分是这样设置的:1,2,3,5,10,20,25,50 那么小明的6发子弹得分都是多少呢?有哪些可能情况呢? 分析: #include <stdio.h> #define N 8 void f(int ta[], int da[], int k, int ho, int bu, int sc)

打靶归来——记参加射击比赛感想

打靶归来 --记参加射击比赛感想 实弹射击是所有军训项目中我最期待的一项,更令我感到兴奋和荣幸的是我竟能成为连里六个参加射击比赛的战士中的一员.我相信每一个男生曾经做过持枪战沙场梦,都曾在射击游戏中释放激情,都曾幻想自己射击时百步穿杨的雄风,而这次军训终于给了我们这样一个触摸真枪发射实弹的机会. 之前几日连队参加了射击预习,在拿枪之初没有人不欢欣鼓舞兴奋异常的,我们这些排在队伍后面的同学对能先摸枪的同学无不羡慕不已.经历漫长的等待后终于能够轮到我们进行射击预习.第一感觉就是枪重,枪在连长手中就跟

递归计算战士打靶S次打了N环一共同拥有多少种可能的问题

问题描写叙述 一个战士打了10次靶.一共打了90环,问一共同拥有多少种可能,并输出这些可能的组合. 思路 首先.嵌套10层循环进行穷举是不可取的,一是由于速度太慢,二是假设改成打20次靶就完蛋了. 事实上这就是一个树的搜索问题. 1. 设第一次打了0环.那么第二次可能打0 ~ 10环这些可能 2. 以第一次打的0环为root,将第二次全部可能的环数都做为root的子结点 3. 反复1, 2步 这样就构成了一棵树.表示当第一次打了0环时全部的可能性. 我们要做的就是从上到下遍历这棵树.当经过的结点

JAVA学习课第五十三届 — IO流程(七)File打靶 &amp;amp; Properties设置

一个.锻炼 深度遍历目录 深度遍历非常自然而然想到递归,而递归就非常自然的想到事实上现的底层算法是栈 对指定文件夹下列出全部内容(包括子文件夹的内容) PS:建议不要遍历C盘 import java.io.*; public class Main { public static void main(String[] args) throws IOException { File dir = new File("D:\\ACM集训"); ListAllDemo(dir,0); } pub

打靶 - 过安全狗实验

1 判断查询列数 2 判断显示位 添加过狗参数 3 查询库名 4 查询表名 5 查第一个flag值 6 查询列名 7 查看用户名和密码 8 密码md5解密 9 用工具扫一下后台路径 10 还扫到了一个重装漏洞 11 登陆进后台 12 寻找上传点并上马,用burpsuit改包,使form-data失效 13 进入大马 14 在网站根目录找到第二个flag 15 在桌面找到第三个flag的时候,无法打开查看,被拦截 16 尝试把安全狗进程杀掉 发现并没有用 17 后来把flag文件下载下来了 18