问题:四人玩火柴棍游戏,每一次都是三个人赢,一个人输。输的人要按赢者手中的火柴数进行赔偿,即赢者手中有多少根火柴棍,输者就赔偿多少根。现知道玩过四次后,每人恰好输过一次, 而且每人手中都正好有16根火柴。问此四人做游戏前手中各有多少根火柴? 编程解决此问题。

     这个问题是一道C++的编程入门题目,如果按正推来解决此问题的话。思路:设四个人的初始火柴棍分别为a,b,c,d.然后对其进行穷举,最后找到满足题意条件的一组值。这种方法的好处是比较简单,但是程序的运行效率可能不是太好,而且代码也比较复杂。

     如果用倒推的方法解决这个问题,则会变的非常简单。思路如下:

     我们知道最后每人手中的火柴棍都是16根,我们假设从第一个人开始,第一个人输第一轮...第四个人输第四轮。

     我们设倒数第一轮时每个人手中的火柴棍分别为a,b,c,d.此时是第四个人输,其他人赢。

 a    b    c    d     (第四轮)

2a    2b    2c    d+a+b+c   (最后)

    有上可知,因为最后的时候每人手中的火柴棍数量相同,所以2a=2b=2c,则a=b=c

    我们设倒数第一轮时每个人手中的火柴棍分别为a1,b1,c1,d1,此时该是第三个输,其他人赢。

 a1    b1    c1    d1     (第三轮)

                                         2a1    2b1    c1-a1-b1-d1    2d1( 这是按规则计算出来的第四轮结果)

a    b    c    d   (第四轮)

此时可知,2a1=a,2b1=b,2d1=d.因此上式可以改写成:

a/2    b/2    c+a/2+b/2+c/2    d/2     (第三轮)

a    b    c    d   (第四轮)

有上面的推断我们可以知道:

a/2    b/2    c+a/2+b/2+c/2    d/2     (第三轮)

 a    b    c    d     (第四轮)

2a    2b    2c    d+a+b+c   (最后)


由此我们可以得知,如果用倒推法来解决此问题的话,我们可以想象这个问题的逆问题:我们初始化刚开始时每人手中有16根火柴棍,而且每轮都是三个人输,一个人赢,每个输的人都需要把自己火柴棍的一半给赢的人。经过四轮这样的比赛,我们求四轮之后每个人手中的火柴棍的数量。这个即是原问题的逆问题。此问题求得的最后每个人手中火柴棍的数量即为原问题的解。

采用这个思路的话,可以很容易的用非常简单的代码来解决这个问题。代码如下:

#include<iostream>
using namespace std;
void main()
{
int a[4]={16,16,16,16};for(int i=0;i<4;i++){for(int j=0;j<4;j++){if(j==i)continue;a[i]+=a[j]/2;a[j]=a[j]/2;}}for(int i=0;i<4;i++){cout<<a[i]<<endl;}}


倒推法解决“四人玩火柴棍游戏,每一次都是三个人赢,一个人输”问题相关推荐

  1. 转载:改“条件导向法”为“目标倒推法”

    http://blog.vsharing.com/chunzhixishui/A1790831.html 改"条件导向法"为"目标倒推法"(转) 做事情的时候, ...

  2. (c语言)轮流抽取扑克牌问题-----倒推法 2021-11-09

    (c语言)轮流抽取扑克牌问题-----倒推法 问题: 54张扑克牌,两个人轮流拿牌,每人每次最少取1张,最多取四张.谁拿最后一张谁输.编写模拟计算机先拿牌且必胜的算法. 问题分析: 要保证每轮拿牌总数 ...

  3. 实用算法的分析与程序设计——递推法(倒推法)

    倒推法就是在不知初始值的情况下,经某种递推关系而获知问题的解或目标,再倒过来,推知它的初始条件.因为这类问题的运算过程是一一映射的,故可分析得其递推公式,然后再从这个解或目标出发,采用倒推手段,一步步 ...

  4. 迭代算法集锦(倒推法)

    求解步骤 1.确定迭代模型 2.建立迭代关系式 3.控制迭代过程 今天我们来用几个简单的例子来了解倒推法 倒推法 1.猴子吃桃 题目描述: 猴子第一天采摘了一些桃子, 第二天吃了第一天的一半多一个, ...

  5. 穿越沙漠问题(C++倒推法)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 题目: 穿越沙漠问题. 用一辆吉普车穿越1000km的沙漠.吉普车的总装油量为500usgal,耗油率为1加仑/km.由于沙漠中没有油 ...

  6. 猴子吃桃问题(C++倒推法)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 题目: 一只猴子摘了若干桃子,每天吃现有桃的一半多一个,到第10天时就只有一个桃子了,求原有多少个桃子? 提示:ai=(1+ai+1) ...

  7. 算法系统学习-正的麻烦反着来呗!(迭代算法-倒推法)

    倒推法 所谓的倒推法,是对某些特殊问题所采用的违反通常习惯的,从后向前推解问题的方法,正向推理比较麻烦时,反而在逆向推理中更加巧妙地解决问题. Case1猴子吃桃问题 一只小猴子摘了若干个桃子,每天吃 ...

  8. 算法第二节:逆推法解决“银行存款问题

    问题描述:母亲为儿子sun 4年的大学生活准备了一笔存款,方式是整取零存,规定sun 每个月月底取下一个月的生活费.假设银行年利息为1.71%,计算该母亲每个月至少要存入多少钱? 算法分析:可采用逆推 ...

  9. C语言解决四人/多人过桥问题

    参加笔试的时候遇到一道经典的算法题,四人过桥问题.当时没写出来

最新文章

  1. Oralce null
  2. Vivado时钟分组约束的三类应用
  3. HBase thrift C++编程
  4. pg 定时删除_PostgreSQL的时间函数使用整理
  5. GIS实战应用案例100篇(三)-基于NDVI指数的绿地信息提取
  6. Adobe Illustrator CS6 绿色简体中文版下载地址
  7. 昔年浅谈做害虫消杀防护的用什么推广效果好?
  8. Hbuilder X 开发APP指南
  9. 前端框架(混合开发框架)
  10. Splunk:大数据智能分析平台全能日志分析利器
  11. 设有一个 Student 数据库,包括 数据库,包括 学生 , 课程 , 选修三个关系: 三个关系: 学生 学生:S ( Sno ,Sname ,Ssex ,Sage,Sdept ) 课程 课程:
  12. Linux下dislocate命令用法,dislocate
  13. 解决罗技K580键盘win和alt键互换问题
  14. SpringDataJPA(二):SpringDataJPA的运行原理以及基本操作
  15. 罗彻斯特大学计算机科学系专业排名,罗切斯特大学排名计算机工程,得用心去看...
  16. 10 款牛哄哄的 Chrome 插件
  17. (转)Java学习书籍推荐
  18. 华师大 OJ 2822
  19. Sentinel 限流使用案例
  20. 陆金所java_陆金所金融核心场景数据库的去 O 之路

热门文章

  1. mysql怎么集合查询_MySql集合查询
  2. 小程序在线客服完整实现
  3. PCIe传输速率和有效带宽计算方式
  4. flink SourceFunction could not be inferred. Support for synthetic interfaces, lambdas, and generic
  5. linux里数据库退格,Oracle Database for Linux 不能使用退格键
  6. 《红楼梦》香的祭祀文化
  7. canvas画线变粗变模糊的解决办法
  8. 京东云服务器做系统,京东云新一代自研云服务器4月上线,云实例承载能力提升2倍...
  9. C++ std::regex | 正则表达式
  10. TREC之使用terrier进行信息检索