问题描写叙述

一个战士打了10次靶。一共打了90环,问一共同拥有多少种可能,并输出这些可能的组合。

思路

首先。嵌套10层循环进行穷举是不可取的,一是由于速度太慢,二是假设改成打20次靶就完蛋了。

事实上这就是一个树的搜索问题。

1. 设第一次打了0环。那么第二次可能打0 ~ 10环这些可能

2. 以第一次打的0环为root,将第二次全部可能的环数都做为root的子结点

3. 反复1, 2步

这样就构成了一棵树。表示当第一次打了0环时全部的可能性。

我们要做的就是从上到下遍历这棵树。当经过的结点之和等于90时,即命中。

然后再将根结点值改成1,直到10。

那么问题来了,一棵树须要遍历多少种组合呢?设打靶次数为t, 那么全部的组合数 = 1+(11)t−1=1+(11)9 种。这个结果已经超过了4亿, 显然全部遍历一遍时间上是不能忍的。我们能够通过剪枝思想来去掉部分不必要的遍历,即推断一下即便以后全打10环时能不能满足90环的要求,假设不能则不须要继续递归了。

另一个问题,我们真的要手动创建一个树形数据结构来运行上面的过程吗?假设这样做理论上是没问题的,可是会消耗大量的内存。 事实上我们能够使用递归的方式来模拟树的遍历。

实现

定义方法

int shoot(int score, int left, int totalScores, Dequeue<Integer> path)

表示已经打了score环。还要打left枪,总环数为totalScores时全部的结果数。这里path是一个栈数据结构。用来记录递归调用的路径,从而记录了一次可能组合的各个环数。

完整代码例如以下:

public class Main {
public static int SHOOT_TIMES = 10; public static void main(String[] args) {
System.out.println(shoot(0, SHOOT_TIMES, 90, new LinkedList<>()));
} /**
* 返回打score环且仅仅能打left枪且总环数为TOTAL_SCORES的全部结果数
* @param score
* @param left
* @param path
* @return
*/
public static int shoot(int score, int left, int totalScores, Deque<Integer> path) {
int tot = 0;
if (1 == left) {
// 剪枝
// 去掉明显不可能的结果
// 即在最后一枪时计算距离90环还剩下的环数,
// 假设环数大于10。则不可能打满
int left_scores = totalScores - score;
// 当剩下的环数在0 ~ 10之间时。表明这是一个可取的组合
if (left_scores >= 0 && left_scores <= 10) {
path.push(left_scores);
printStack(path);
path.pop(); ++tot;
} path.pop();
return tot;
} for (int i = 0 ; i <= 10 ; ++i) {
// 剪枝.
// 计算已经打了score环时还剩下多少环.
// 假设即便剩下全打10环还打不满90环,则表示这不是一个可取的结果
if (totalScores - (score + i) <= 10 * left) {
path.push(i);
tot += shoot(score + i, left - 1, totalScores, path);
}
} if (false == path.isEmpty()) {
path.pop();
}
return tot;
} /**
* 打印出栈内的全部元素
* @param list
*/
private static void printStack(Deque<Integer> list) {
int ix = 0;
int LEN = list.size();
for (Integer n : list) {
if (ix == LEN - 1) {
System.out.printf("%d\n", n);
break;
}
System.out.printf("%d, ", n); ++ix;
}
}
}

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

  1. BP神经网络算法推导及代码实现笔记zz

    一. 前言: 作为AI入门小白,参考了一些文章,想记点笔记加深印象,发出来是给有需求的童鞋学习共勉,大神轻拍! [毒鸡汤]:算法这东西,读完之后的状态多半是 --> “我是谁,我在哪?” 没事的 ...

  2. 两个NOI题目的启迪8皇后和算24

    论出于什么原因和目的,学习C++已经有一个星期左右,从开始就在做NOI的题目,到现在也没有正式的看<Primer C++>,不过还是受益良多,毕竟C++是一种”低级的高级语言“,而且NOI ...

  3. hihoCoder_二分&#183;归并排序之逆序对

    一.题目 题目1 : 二分·归并排序之逆序对 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 在上一回.上上回以及上上上回里我们知道Nettle在玩<艦これ&g ...

  4. php使用递归计算目录大小

    本文章向大家介绍php如何计算某个目录的大小(多少kb,多少兆m),主要使用filesize函数配合递归函数的方法来实现,需要的朋友可以参考一下本文章的源代码.php使用递归计算目录大小,主要使用fi ...

  5. Python 递归计算分数数列

    C语言的课后习题 求数列:2/1,3/2,5/3,8/5,13/8,21/13,...前50项的和 数列规律: 第二项的分母是[前一项分子] 第二项的分子是[前一项分子与分母的和] from frac ...

  6. java程序员到底该不该了解一点算法(一个简单的递归计算斐波那契数列的案例说明算法对程序的重要性)

    为什么说 “算法是程序的灵魂这句话一点也不为过”,递归计算斐波那契数列的第50项是多少? 方案一:只是单纯的使用递归,递归的那个方法被执行了250多亿次,耗时1分钟还要多. 方案二:用一个map去存储 ...

  7. 【Unity3D】射箭打靶游戏(简单工厂+物理引擎编程)

    打靶游戏:     1.靶对象为 5 环,按环计分:    2.箭对象,射中后要插在靶上:    3.游戏仅一轮,无限 trials: 增强要求:  添加一个风向和强度标志,提高难度 游戏成品图: U ...

  8. 3Ds Max实例教程-制作女战士全过程

    3Ds Max制作“女战神” 作者:Diego Rodríguez 使用软件:3Ds Max,Photoshop 3Ds Max下载:http://wm.makeding.com/iclk/?zone ...

  9. OC CollectionView和TableView自身高度的隐式递归计算,改变父试图布局

    CollectionView和TableView自身高度的隐式递归计算 1.前沿:我们一般会碰到这样的需求,一个tableview或者一个colletionview放在一个scrollview上边,而 ...

随机推荐

  1. RabbitMQ与PHP(一)

    RabbitMQ与PHP(一) 项目中使用RabbitMQ作为队列处理用户消息通知,消息由前端PHP代码产生,处理消息使用Python,这就导致代码一致性问题,调整消息定义时需要PHP和Python都 ...

  2. bzoj 1038 瞭望塔 半平面交+分段函数

    题目大意 给你一座山,山的形状在二维平面上为折线 给出\((x_1,y_1),(x_2,y_2)...(x_n,y_n)\)表示山的边界点或转折点 现在要在\([x_1,x_n]\)(闭区间)中选择一 ...

  3. 洛谷P1120 小木棍(sticks数据加强版)

    题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编 ...

  4. 【CF1017B】The Bits(模拟)

    题意:给定两个二进制数字a,b,可以任意交换a中的两个bit位,求进行这样一次操作,最多可产生多少种不同的a or b n<=1e5 思路:模拟,分类讨论 #include<cstdio& ...

  5. 【CF700B】Connecting Universities(贪心,树上最短路)

    题意:给出一棵树上的2*k个节点,给他们配对,使得他们之间的距离和最大. 思路:一条边的两侧如果有一侧没有给定的节点就不会被经过…… 如果有1个节点就会被经过1次…… 如果两侧分别有x,y个给定节点就 ...

  6. 标准C程序设计七---36

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  7. linux .so .a .o 文件

    linux下文件的类型是不依赖于其后缀名的,但一般来讲:.o,是目标文件,相当于windows中的.obj文件.so 为共享库,是shared object,用于动态连接的,和dll差不多.a为静态库 ...

  8. PE+ 1.0 ( Pump Express Plus 1.0 )

    Dialog iW1788 for PE+ 1.0 Dialog iW1680 for PE PE+1.0 for up to 15W battery, improve charging time, ...

  9. java parse 带英文单词的日期字符串(转化新浪微博api返回的时间)

    String str = "Sun Sep 23 00:32:57 +0800 2012"; SimpleDateFormat dateFormat = new SimpleDat ...

  10. Python基础数据类型补充及深浅拷贝

    本节主要内容:1. 基础数据类型补充2. set集合3. 深浅拷贝主要内容:一. 基础数据类型补充首先关于int和str在之前的学习中已经讲了80%以上了. 所以剩下的自己看一看就可以了.我们补充给一 ...