递归计算战士打靶S次打了N环一共同拥有多少种可能的问题
问题描写叙述
一个战士打了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环一共同拥有多少种可能的问题的更多相关文章
- BP神经网络算法推导及代码实现笔记zz
一. 前言: 作为AI入门小白,参考了一些文章,想记点笔记加深印象,发出来是给有需求的童鞋学习共勉,大神轻拍! [毒鸡汤]:算法这东西,读完之后的状态多半是 --> “我是谁,我在哪?” 没事的 ...
- 两个NOI题目的启迪8皇后和算24
论出于什么原因和目的,学习C++已经有一个星期左右,从开始就在做NOI的题目,到现在也没有正式的看<Primer C++>,不过还是受益良多,毕竟C++是一种”低级的高级语言“,而且NOI ...
- hihoCoder_二分·归并排序之逆序对
一.题目 题目1 : 二分·归并排序之逆序对 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 在上一回.上上回以及上上上回里我们知道Nettle在玩<艦これ&g ...
- php使用递归计算目录大小
本文章向大家介绍php如何计算某个目录的大小(多少kb,多少兆m),主要使用filesize函数配合递归函数的方法来实现,需要的朋友可以参考一下本文章的源代码.php使用递归计算目录大小,主要使用fi ...
- Python 递归计算分数数列
C语言的课后习题 求数列:2/1,3/2,5/3,8/5,13/8,21/13,...前50项的和 数列规律: 第二项的分母是[前一项分子] 第二项的分子是[前一项分子与分母的和] from frac ...
- java程序员到底该不该了解一点算法(一个简单的递归计算斐波那契数列的案例说明算法对程序的重要性)
为什么说 “算法是程序的灵魂这句话一点也不为过”,递归计算斐波那契数列的第50项是多少? 方案一:只是单纯的使用递归,递归的那个方法被执行了250多亿次,耗时1分钟还要多. 方案二:用一个map去存储 ...
- 【Unity3D】射箭打靶游戏(简单工厂+物理引擎编程)
打靶游戏: 1.靶对象为 5 环,按环计分: 2.箭对象,射中后要插在靶上: 3.游戏仅一轮,无限 trials: 增强要求: 添加一个风向和强度标志,提高难度 游戏成品图: U ...
- 3Ds Max实例教程-制作女战士全过程
3Ds Max制作“女战神” 作者:Diego Rodríguez 使用软件:3Ds Max,Photoshop 3Ds Max下载:http://wm.makeding.com/iclk/?zone ...
- OC CollectionView和TableView自身高度的隐式递归计算,改变父试图布局
CollectionView和TableView自身高度的隐式递归计算 1.前沿:我们一般会碰到这样的需求,一个tableview或者一个colletionview放在一个scrollview上边,而 ...
随机推荐
- URAL 1106 Two Teams二分图
S - Two Teams Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submi ...
- 利用hibernate与struts框架制作简单注册界面
一:配置hibernate 1.导包 hibernate包和jdbc连接mysql数据库的包 2.实用工具生成hibernate配置文件和映射文件 3.做好hibernateUtil生成session ...
- hdu6038[找规律+循环节] 2017多校1
/*hdu6038[找规律+循环节] 2017多校1*/ #include<bits/stdc++.h> using namespace std; typedef long long LL ...
- [USACO Section 2.3] Cow Pedigrees (动态规划)
题目链接 Solution 我DP太菜啦... 考虑到一棵二叉树是由根节点以及左儿子和右儿子构成. 所以答案其实就是 左儿子方案数*右儿子方案数 . 状态定义: \(f[i][j]\) 代表深度为 \ ...
- 【python接口自动化】logger
#! /usr/bin/env python # coding=GBK import logging, os class Logger: def __init__(self, path, clevel ...
- 【BZOJ2693】jzptab (莫比乌斯反演)
Description 给你$n$,$m$,求 $\sum^n_{i=1} \sum^m_{j=1} \ lcm(x,y)$ 答案对$100000009$取模. 多组数据. Input 第一行有一个正 ...
- WebRTC VoiceEngine综合应用示例(二)——音频通话的基本流程(转)
下面将以实现一个音频通话功能为示例详细介绍VoiceEngine的使用,在文末将附上相应源码的下载地址.这里参考的是voiceengine\voe_cmd_test. 第一步是创建VoiceEngin ...
- 【Linux】多进程与多线程之间的区别
http://blog.csdn.net/byrsongqq/article/details/6339240 网络编程中设计并发服务器,使用多进程与多线程 ,请问有什么区别? 答案一: 1,进程:子 ...
- mysql tinyint bit
Java bit 对应 mysql tinyint(1) false = 0 ,true = 1.
- 通过jQuery Ajax提交表单数据时同时上传附件
1.使用场景:需要使用ajax提交表单,但是提交的表单里含有附件上传 2.代码实现方式: <!-- HTML代码 --> <form method="post" ...