百鸡问题的四种(层)解法

article/2025/8/29 22:17:30

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


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

基本思路:(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的时候,强烈建议使用解法三,因为你不可能一开始就知道结果是什么和有多少种解法,以上是我对该算法的理解,如果你觉得还有优化的细节,欢迎留言,一同进步。


http://chatgpt.dhexx.cn/article/DueVPBOo.shtml

相关文章

利用usmart组件对stm32进行调试

一、介绍usmart 二、使用usmart的三个前提 1、封装好正点原子的usmart文件 2、写好串口的hal库回调函数及其中断处理函数 3、是否开启一个定时器中断&#xff08;最好选是&#xff09; 开启&#xff1a;1&#xff0c;关闭&#xff1a;0 三、将需要调试的代码usmart_config.c内…

USMART组件应用

首先通过usmart组件可以用来调试程序里的任何函数的参数&#xff0c;通过串口助手。 USMART的特点&#xff1a; 1&#xff0c; 可以调用绝大部分用户直接编写的函数。 2&#xff0c; 资源占用极少&#xff08;最少情况&#xff1a; FLASH:4K SRAM:72B &#xff09;。 3&#xf…

STM32学习笔记(十八)USMART调试组件实验

STM32F103ZET6之USMART调试组件实验 文章目录 STM32F103ZET6之USMART调试组件实验前言一、简介二、使用步骤1.将相关文件复制到文件夹2.添加相关.c及.h文件至工程下3.配置相关函数 三、实验结果总结 前言 对于STM32的学习可分为3个版本。1.寄存器版本2.库函数版本3.HAL库版本由…

【正点原子STM32连载】 第二十六章 USMART调试组件实验摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十…

【正点原子STM32连载】 第二十六章 USMART调试组件实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

1&#xff09;实验平台&#xff1a;正点原子MiniPro H750开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id677017430560 3&#xff09;全套实验源码手册视频下载地址&#xff1a;http://www.openedv.com/thread-336836-1-1.html 4&#xff…

使用cubemx 生成Usmart调试神器,以STM32F103RE为例

1.USMART是什么&#xff1f; 使用USMART&#xff0c;你可以轻易的修改函数参数、查看函数运行结果&#xff0c;从而快速解决问题。 比如你调试一个摄像头模块&#xff0c;需要修改其中的几个参数来得到最佳的效果&#xff0c;普通的做法&#xff1a;写函数→修改参数→下载→…

(21)STM32——通过键盘控制舵机和LED灯(利用正点原子USMART实现)

目录 学习目标 运行结果 内容 调试过程 应用场景 特点 文件组介绍 配置步骤 usmart_config.c main.c 系统命令 串口调试 代码 总结 学习目标 本节我们来学习有关正点原子USMART的章节&#xff0c;简而言之&#xff0c;USMART是一种调试工具&#xff0c;具体的工作…

STM32------USMART调试组件

目录 一、什么是USMART 二、USMART调试过程 三、USMART应用场景 四、USMART特点 五、USMART文件组 六、USMART配置步骤 七、USMART系统命令 一、什么是USMART 二、USMART调试过程 三、USMART应用场景 四、USMART特点 五、USMART文件组 六、USMART配置步骤 &#xff08;TFTLCD实…

STM32的USMART移植

使用USMART的原因 当博主也是学生的时候&#xff0c;并没有觉得USMART有多大的作用&#xff0c;就当作一个串口信息交互而已&#xff0c;我可以直接用串口来写就好了&#xff0c;当然这跟我之前没有认真了解过USMART的功能有关&#xff0c;忽略了这个简单却又十分使用的调试助…

stm32-mini学习笔记-USMART调试组件

目录 USMART调试过程 USMART特点 USMART文件简介 USMART配置步骤 USMART系统命令 实验现象 main中代码 USMART调试过程 1.串口发送命令调用函数 2.单片机节后到命令后&#xff0c;解析命令&#xff0c;调用对应的函数 3.调用函数 USMART特点 1&#xff0c; 可以调用绝…

USMART学习

文章目录 前言一、例程测试二、使用方法总结 前言 正点原子USMART组件可以方便地对函数参数进行修改&#xff0c;学习以下如何使用。 实验平台&#xff1a;战舰开发板F103 实验目的&#xff1a;学习USMART使用 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供…

STM32学习之USMART使用

看到没有,我不是标题党,这个蓝桥杯用不了我就没加!! USMART是正点原子推出的一款利用串口通信方便调参的工具。 简单来说: 一般情况下函数的入口参数调整很麻烦,你需要 1.改变参数 2.编译 3.下载 4.观察 用了USMART以后,只需要 1.串口发送你需要的参数 2.观察 这样子…

STM32F4_USMART调试组件

目录 1. USMART是什么&#xff1f; 2. USMART的特点 3. USMART实现流程 4. USMART组件 5. 在usmart_config.c中添加想要被USMART调用的函数 6. 实验程序 6.1 main.c 6.2 usmart.c 6.3 usmart.h 7. USMART调试的优越性说明 1. USMART是什么&#xff1f; USMART 是 AL…

正点原子USMART组件移植

文章目录 一、打开Cube&#xff0c;建立工程二、系统配置三、配置测试IO四、在 Clock Configuration中:五、工程输出配置六、开始移植七、组件分析 MCU&#xff1a;正点原子阿波罗开发板 IDE&#xff1a; MDK-ARM V5 STM32CubeMX5.2.2 一、打开Cube&#xff0c;建立工程 点击AC…

USMART组件

USMART调试组件 一、原理 首先&#xff0c;啥是USMART啊&#xff1f; 简单来说就是通过串口与开发板进行交互的工具。使用USMART的目的是减少使用J-LINK调试或者修改代码输入参数再进行下载等操作&#xff0c;通过串口传递参数&#xff0c;从而简化程序修改过程以及减少FLASH…

USMART调试组件实验

USMART是正点原子团队为其STM32开发平台开发的一种类似linux的shell的调试工具。具体工作过程是通过串口发送命令给单片机&#xff0c;然后单片机收到命令之后调用单片机里面对应的相关函数&#xff0c;并执行&#xff0c;同时支持返回结果。 USMART调试过程&#xff1a; USMA…

stm32之USMART调试组件的使用

文章目录 一、USMART是什么&#xff1f;二、使用步骤 一、USMART是什么&#xff1f; USMART 是由 ALIENTEK 开发的一个灵巧的串口调试互交组件&#xff0c;通过它你可以通过串口助手调用程序里面的任何函数&#xff0c;并执行。因此&#xff0c;你可以随意更改函数的输入参数(…

USMART 调试组件实验

文章目录 前言一、USMART调试组件简介USMART组件的移植 二、硬件设计三、软件设计 前言 本章&#xff0c;我们将向大家介绍一个十分重要的辅助调试工具&#xff1a;USMART 调试组件。该组件由 ALIENTEK 开发提供&#xff0c;功能类似 linux 的 shell&#xff08;RTT 的 finsh …

USMART串口调试

目录 一、USMART简介二、USMART的移植2.1 usmart_str.h头文件2.2 usmart.h头文件2.3 usmat_str.c源文件2.4 usmart.c源文件2.5 usmart_config.c源文件 三、USMART的实现3.1 USMART的实现流程3.2 USMART的调用 一、USMART简介 USMART是由ALIENTEK开发的一个灵巧的串口调试互交组…

USMART

USMART是正点原子团队为其STM32开发平台开发的一种类似linux的shell的调试工具。具体工作过程是通过串口发送命令给单片机,然后单片机收到命令之后调用单片机里面对应的相关函数,并执行,同时支持返回结果。 普通的做法&#xff1a;写函数 ->修改参数->下载->看结果-&…