例题:百鸡问题 有一个人有一百块钱,打算买一百只鸡。到市场一看,公鸡五块钱一只,母鸡三块钱一个,小鸡一块钱三只。现在,请你编一程序,帮他计划一下,怎么样买法,才能刚好用一百块钱买一百只鸡?


首先先来认识一下,何谓暴力破解法?是指从可能的解集合(空间)中一一列举各情况,用题目给定的检验条件判定哪些是无用的,哪些是有用的。能使命题成立者,即为问题的解。

基本思路:(1)建立问题的数学模型,确定问题的可能解的集合(可能解的空间)。

(2)逐一列出可能解集合中的元素,验证是否是问题的解。

优化方向:通过加强约束条件,缩小可能解的集合的规模。


按照暴力破解法的思想,我们首先会想到的就是直接所有循环破解,管你牛鬼蛇神。

解法一:1.抽象出数学模型,这里指的就是方程组

设公鸡为x,母鸡为y,小鸡为z,

鸡:  x+y+z=100

钱:  5x+3y+1/3z=100

2.算法

#include<iostream>
using namespace std;int main(){int x,y,z;for(x=0;x<=20;x++)//公鸡不会超过20只for(y=0;y<=34;y++)//母鸡不会超过34只for(z=0;z<=100;z++)//小鸡不会超过100只if((x+y+z)==100 && (5*x+3*y+z/3)==100&&z%3==0)//同时要满足z是3的整数cout<<"x="<<x<<" "<<"y="<<y<<" "<<"z="<<z<<endl;             return 0;
}

3.结果

算法分析:显然,该算法嵌套三重循环,算法复杂度为O(n^3), 循环次数为20*34*100,数量级为10^4,这种算法根本不能满足我们的需求。所以聪明一点的人可能会想到要减少一个循环的嵌套,以此降低算法复杂度。


解法二:1.减少一个循环的嵌套,模型不变,进一步优化算法

2.

#include<iostream>
using namespace std;
int main(){int x,y,z;for(x=0;x<=20;x++)//公鸡不会超过20只for(y=0;y<=34;y++)//母鸡不会超过34只{z=100-x-y;//根据x,y可求出zif(z==(300-15*x-9*y)&&z%3==0)cout<<"x="<<x<<" "<<"y="<<y<<" "<<"z="<<z<<endl;}                       return 0;
}

算法分析:显然,该算法嵌套二重循环,算法复杂度为O(n^2), 循环次数为20*34,数量级为10^2,这种算法比上一算法足足降低了2个数量级,可见循环嵌套越多,算法就越差。所以还需要继续优化,用我们的初中数学知识就OK.


解法三:1.每使用一个for(x)循环,就相当于将一个未知数(x)变成已知数(x), 两个方程两个未知数,方程就具有可解性了, 这样就可以, 继续减少一个循环的嵌套

鸡:  x+y+z=100

钱:  15x+9y+z=300

=>>7x+4y=100   ->y    ->z

2.

#include<iostream>
using namespace std;
int main(){int x,y,z;for(x=0;x<=20;x++)//公鸡不会超过20只{y=25-1.75*x;//先求yz=100-x-y;//再求zif(z==(300-15*x-9*y)&&z%3==0&&y>0&&&z>0)cout<<"x="<<x<<" "<<"y="<<y<<" "<<"z="<<z<<endl;}return 0;
}

算法分析:显然,该算法只有一重循环,算法复杂度为O(n), 循环次数为20,数量级为10,这种算法比上一算法降低了1个数量级,说明该算法还是不错的,可以满足我们日常的需求。不过数学思维比较好的人,可以通过结果反过来继续优化。


解法四:

通过上图的结果,我们发现  x以4递增,y以7递减,   z以3递增,所以可以直接打印

#include<iostream>
using namespace std;
int main(){int x,y,z;for(int k=0;k<=3;k++){x = 4 * k;y = 25 - 7 * k;z = 75 + 3 * k; cout<<"x="<<x<<" "<<"y="<<y<<" "<<"z="<<z<<endl;}return 0;
}

算法分析:这种算法可以说是接近最优了,不过在AC的时候,强烈建议使用解法三,因为你不可能一开始就知道结果是什么和有多少种解法,以上是我对该算法的理解,如果你觉得还有优化的细节,欢迎留言,一同进步。

百鸡问题的四种(层)解法相关推荐

  1. c加加语言三体问题,一道典型三体问题的四种别致解法

    在国家级优秀核心期刊<物理教学>上发表 一道典型三体问题的四种别致解法 温应春 (甘肃省天水市第十中学 741029) 这是一道有关动量的典型的三体问题,拟通过以下四种不同的解法,开辟解决 ...

  2. 神经网络基础:七种网络单元,四种层连接方式

    2016 年 9 月,Fjodor Van Veen 写了一篇名为<The Neural Network Zoo>的文章(详见图文并茂的神经网络架构大盘点:从基本原理到衍生关系 ),全面盘 ...

  3. 历届真题 小朋友崇拜圈【第九届】【省赛】【C组】——【C++】【C】【Java】【Python】四种语言解法

    整个题目: 资源限制 内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s 班里N个小朋友,每个人都有自己最崇拜的一个小朋友( ...

  4. 关于百钱买百鸡的解题思想

    题目:编写程序解决"百钱买百鸡"问题.公鸡五钱一只,母鸡三钱一只,小鸡 一钱三只,现有百钱欲买百鸡,共有多少种买法? 看到这类题目,首先要想到的就是遍历. 首先求出全买公鸡能买多少 ...

  5. 计算机求百钱买百鸡采用的算法,多种解法求百钱百鸡问题.doc

    多种解法求百钱百鸡问题 学 号: 0121210680225 <算法设计与分析B> 大 作 业 题 目多种解法求百钱百鸡问题学 院计算机科学与技术学院专 业软件工程班 级Sy1201姓 名 ...

  6. 百钱买百鸡python编程列表推导式_使用循环和列表推导式两种方法求解百钱买百鸡问题。假设大鸡5元一只,中鸡3元一只,小鸡1元三只,现有100元钱想买100只鸡,有多少种买法?...

    [程序题]编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数 1/1+1/3+...+1/n [单选题]患者男,67岁.确诊为原发性支气管肺癌,为行手术 ...

  7. 四种解法——求子序列的最大连续子序和(普通解法、求和解法、分治法、O(n)级解法)(面试经典题)

    励志用少的代码做高效表达 在这四种解法里,解法一是通法,可以学到规律和知识,做基础之用:解法二在解法一的基础上做改进,锻炼思维:解法三则是大名鼎鼎的分治法,涉及到递归的知识,算是"高效算法设 ...

  8. lvs工作在第几层_LVS 原理(调度算法、四种模式、四层负载均衡和七层 的区别)...

    目录 lvs的调度算法 lvs的四种模式 四层均衡负载和七层的区别 1.lvs调度算法(最常用的四种) 轮叫调度(rr) 调度器通过外部请求的顺序轮流分配到集群中的真实服务器上,对每台服务器都是均等的 ...

  9. python123百钱买百鸡_求解百钱买百鸡问题。假设大鸡 5 元一只,中鸡 3 元一只,小鸡 1 元三只,现有 100 元钱想买 100 只鸡,有多少种买法?截图代码和运行结果_学小易找答案...

    [填空题]表达式 'apple.peach,banana,pear'.find('ppp') 的值为 ________ . [填空题]已知 x = '123' 和 y = '456' ,那么表达式 x ...

  10. python123百钱买百鸡_day01笔记-百钱买百鸡(100文钱,必须买100只鸡,有几种方式)

    简单的用户密码验证程序 hello.txt # coding:utf-8 #raw_input函数 提示用户输入用户名 user = raw_input("请输入用户名:") pa ...

最新文章

  1. 登陆成功率 99%,云知声携手平安好医生推声纹登录系统
  2. 人工智能可以发现数据中隐藏的物理规律
  3. 高性能的MySQL(5)索引策略-索引和表的维护
  4. boost::mpl::divides相关的测试程序
  5. 美国计算机科学专业申请要求,美国计算机科学专业好申请吗?申请要求高不高...
  6. 1、RN跨平台开发——环境搭建
  7. (王道408考研操作系统)第一章计算机系统概述-第一节1:操作系统基本概念以及目标和功能
  8. django-模型类操作-初期阶段-小结
  9. OJ系统里用BufferedReader提高效率
  10. 宁德时代811电芯初现真容 搭配宝马X1混动汽车能量密度提升近6成
  11. 关于JSTL的简单说明
  12. windows下支持H265的rtmp ffplay播放器 ffmpeg的编译
  13. 苹果手机怎么设置新的id
  14. 检察机关认定河北涞源反杀案为正当防卫 决定不起诉女生父母
  15. 通过函数seaborn.cubehelix_palette生成顺序调色板
  16. 用计算机时的注意事项,计算机使用注意事项
  17. 写了很久,这是一份最适合/贴切普通大众/科班/非科班的『学习路线』
  18. PLC流程控制类指令(JMP)编程应用
  19. linux内核 猪头 作用,Linux内核驱动之一些重要数据结构
  20. 随机过程 更新过程(上)

热门文章

  1. android 模拟器好用哪个,安卓模拟器哪个好用 常用安卓模拟器性能大盘点
  2. 手机无法服务器获取信息,荒野行动获取服务器信息一直不动怎么办 获取服务器信息为0解决方法...
  3. 使用vscode如何建立vue模板
  4. 【Bug解决】yum提示Another app is currently holding the yum lock; waiting for it to exit...
  5. 从傅里叶级数到拉普拉斯变换
  6. 文法规则自顶向下分析
  7. Javascript跨域和Ajax跨域解决方案总结
  8. JavaScript跨域请求
  9. 注意:CISSP考试重考政策更新
  10. m1芯片xcode打包IPA processing failed错误解决方案