枚举

首先,最为简单的思想,枚举算法。枚举也叫穷举,顾名思义,就是穷尽列举。枚举思想的应用场景十分广泛,也非常容易理解。简单来说,枚举就是将问题的可能解依次列举出来,然后一一带入问题检验,从而从一系列可能解中获得能够解决问题的精确解。

枚举虽然看起来简单,但是其实还是有一些容易被人忽视的考虑点。比方说待解决问题的「可能解/候选解」的筛选条件,「可能解」之间相互的影响,穷举「可能解」的代价,「可能解」的穷举方式等等。

很多时候实际上不必去追求高大上的复杂算法结构,反而大道至简,采用枚举法就能够很好的规避系统复杂性带来的冗余,同时或许在一定程度上还能够对空间进行缩减。
枚举思想的流程可以用下图来表示。通过实现事先确定好「可能解」,然后逐一在系统中进行验证,根据验证结果来对「可能解」进行分析和论证。这是一种很明显的结果导向型的思想,简单粗暴地试图从最终结果反向分析「可能解」的可行性。


不过,枚举思想的劣势当然也很明显。在实际的运行程序中,能够直接通过枚举方法进行求解的问题少之又少。而当「可能解」的筛选条件不清晰,导致「可能解」的数量和范围无法准确判断时,枚举就失去了意义。

然而当「可能解」的规模比较小,同时依次验证的过程容易实施时,枚举思想不失为一种方便快捷的方式。只不过在具体使用时,还可以针对应用场景对「可能解」的验证进行优化。

这种优化可以从两个方向入手,一是问题的简化,尽可能对需要处理的问题进行模型结构上的精简。这种精简具体可体现在问题中的变量数目,减少变量的数据,从而能够从根本上降低「可能解」的组合。

二是对筛选「可能解」的范围和条件进行严格判断,尽可能的剔除大部分无效的「可能解」。

虽说如此,但是一般而言大部分枚举不可用的场景都是由于「可能解」的数量过多,无法在有限空间或有限时间内完成所有可能性的验证。不过实际上枚举思想是最接近人的思维方式,在更多的时候是用来帮助我们去「理解问题」,而不是「解决问题」。

应用

百钱买百鸡问题。 该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?

翻译过来,意思是公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只?

:假设公鸡有x只,母鸡有y只,则小鸡有100-x-y只。可以推出一个等式:5x + 3y + (100-x-y)*1/3 = 100。由于鸡的数量肯定不能为小数,所以我们在等式两边同乘3,变为 15x + 9y + 100-x-y = 300。再化简:14x + 8y = 200;有了该等式,我们的代码就显得很简单了。

//公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,
//现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只?
int BuyChicken(int price, int num)// 钱, 只
{int total = 0;for (int x = 0; x < num / 5; ++x){for (int y = 0; y < num / 3; ++y){int z = num - x - y;//15*x + 9*y + z = 3*priceif (14 * x + 8 * y == 2 * price){++total;printf("公鸡:%d, 母鸡:%d, 小鸡:%d, \n", x, y, z);}}}return total;
}int main()
{int price = 100;int num = 100;int res = BuyChicken(price, num);printf("花%d块钱买%d只鸡共有%d中方案\n", price, num, res);return 0;
}

运行结果:

枚举算法(百钱百鸡问题 C语言)相关推荐

  1. 枚举法C语言三个马驮东西,【MagO第三期】经典枚举算法题:百钱买百鸡

    原标题:[MagO第三期]经典枚举算法题:百钱买百鸡 01 历史故事 张邱建提出的百钱买百鸡问题: 山东临清的数学家--张邱建,约公元5世纪著名的大数学家.他将毕生的精力投入到算学研究之中,为数学的不 ...

  2. 算法之枚举及其优化(1)——百钱百鸡问题的多种解法(一重循环解决)

    目录 写在前面: 从百钱百鸡问题说起 直接枚举(暴力破解) 开始优化(缩小枚举范围) 继续优化(二重循环) 最终优化(一重循环) 总结 写在后面 写在前面: 本文适合初学者学习,鉴于本人能力有限以及希 ...

  3. 算法思想(枚举)——百钱百鸡+生理周期+完美立方+熄灯问题+讨厌的青蛙

    枚举的思想其实时日常生活中提取的一种智慧 ^------^ 枚举的思想在生活中有着非常广泛的应用        在对事物进行归纳推理时,会逐一考察某个事物的所有可能的情况,并且逐一进行检验,这就是枚举 ...

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

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

  5. 百钱百鸡问题(C++枚举法)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 题目: 中国古代数学家张丘建在他的<算经>中提出了著名的"百钱百鸡问题":鸡翁一,值钱五:鸡母一,值钱 ...

  6. 百钱百鸡php穷举法,PHP经典题:百钱百鸡问题(穷举算法)

    PHP经典题:百钱百鸡问题(穷举算法) 百钱百鸡问题: 已知:公鸡5元一只,母鸡3元一只,小鸡一元3只 现用100元钱买了100只鸡,问:公鸡母鸡小鸡各几只? --请考虑尽可能高效的方法 思路: 如果 ...

  7. java while求百钱买百鸡问题_java - 百钱百鸡小算法

    百钱百鸡是一个非常经典的不定方程问题,最早源于我国古代的<算经>,这是古代著名数学家张丘建首次提出的.百钱百鸡问题原文如下: 鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买白鸡,问 ...

  8. java - 百钱百鸡小算法

    传送门: 袁咩咩的小小博客 百钱百鸡是一个非常经典的不定方程问题,最早源于我国古代的<算经>,这是古代著名数学家张丘建首次提出的.百钱百鸡问题原文如下: 鸡翁一,值钱五,鸡母一,值钱三,鸡 ...

  9. python算法1.5百钱百鸡

    1.问题描述 中国古代数学家张丘建在他的<算经>中提出了一个著名的"百钱百鸡问题":一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现在要用百钱买百鸡,请问公鸡.母鸡. ...

  10. Python趣味算法入门 - 百钱百鸡

    问题描述 中国古代数学家张邱建在他的<算经>中提出了一个著名的"百钱百鸡问题":一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现在要用百钱买百鸡,请问公鸡.母鸡.小鸡 ...

最新文章

  1. 并查集类的c++封装,比较union_find algorithm四种实现方法之间的性能差别
  2. 第8天:我用AI算法造了一些“网红”
  3. vue 不识别svg_vue中引用svg,vue引入svg不显示,vue引用svg配置,vue3.0+ts如何配置svg...
  4. 机器学习术语_机器学习术语神秘化。
  5. Java第二次实验报告——Java面向对象程序设计
  6. 精美UI版iApp对接hybbs论坛功能APP源码
  7. 漫步数理统计十八——相关系数
  8. 自动输入命令执行_Ubuntu命令行操作-命令简介
  9. Jsp版本的计算器(九大对象)
  10. 《5》CentOS7.0+OpenStack+kvm云平台部署—配置Horizon
  11. 新人如何在职场中生存
  12. [整理]flex,datagrid数值列排序
  13. qpython做连点器脚本_「PyMouse」做个连点器给老师点赞
  14. 埃默里大学又一华人科学家被要求搬离实验室,当事人称“这是报复”
  15. 消费者京东自营买到假茅台 茅台鉴定报告称确属假冒
  16. 计算机程序运行消耗的内存,电脑内存多大合适?运行内存占用率高的秘密
  17. Guava学习之Map
  18. 学习笔记:android下获取sdcard容量大小
  19. npy文件的打开,读取
  20. PHP 判断链表是否相交

热门文章

  1. ML Mastery 博客文章翻译 20220116 更新
  2. 一个非常好用的插件-FeHelper
  3. 康末otdr测试软件丢失,利用OTDR快速定位光缆线路故障-测试测量-与非网
  4. 【代码规范】阿里巴巴代码规范
  5. echarts地图示例
  6. wsdl文件 服务器地址,webservice 的wsdl文件详解
  7. Kettle的改名由来
  8. X64Dbg手动去WinRAR广告
  9. JavaScript库和框架
  10. Navicat15安装教程超详细步骤