首页 > 编程语言 >c++算法 枚举———百钱白鸡问题

c++算法 枚举———百钱白鸡问题

时间:2024-09-21 13:19:37浏览次数:3  
标签:输出 百钱 样例 c++ 枚举 白鸡 100

前言

枚举,是一种最基本的算法思想,通过穷举枚举出所有的可能,再加以比较。

枚举算法适用于问题规模较小、解空间可穷举的情况。它的优点是简单直观,不需要复杂的数学推导,易于实现。但是,对于问题规模较大的情况,枚举算法的时间复杂度可能会非常高效率较低

接下来会介绍两个百钱白鸡的经典问题,解释枚举算法的意义。

题目示例

示例1:百钱白鸡1

题目描述

中国数学家张邱建(公元五世纪,其它资料不详)在他的《算经》中提出了著名的“百钱买百鸡”问题:

鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。

百钱买百鸡,问翁、母、雏各几何?

你的任务:输出所有可行的方案。

输入格式

输出格式

输出共有若干行:

每行三个整数,相互之间用1个空格隔开,依次为公鸡、母鸡、小鸡的数量。

所有方案,第一优先级按公鸡的数量从小到大排列。

样例 

样例输入 #1

(无)

样例输出 #1

(无)

方法1:

推荐指数:⭐

先按照暴力枚举的方法写一个三重循环(位置数有三个,所以是三重循环)

代码:

#include<bits/stdc++.h>
#define in int
using namespace std;
in main() 
{
	for(in i=0;i<=100;i++)
    {
    	for(in j=0;j<=100;j++)
    	{
    		for(in k=0;k<=100;k++)
    		{
    			//从所有可能解中找可行解
    			//常数写前面 
				if(k%3==0&&100==i+j+k&&100==i*5+j*3+k/3) 
				{
					cout<<i<<" "<<j<<" "<<k<<endl;
				}
			}
		}
	}
    return 0;
}

提交上去,会发现TLE爆了0分(如果OJ严)

所以,我们还需要简化:

方法2:

推荐指数:⭐⭐

我们可以进行枚举范围的缩减,也就是for循环范围的缩减。根据等式

公鸡+母鸡+小鸡=100

可得出以下范围:

公鸡:0~20
母鸡:0~33
小鸡:0~100//最多买到300只,但题目只让买100只

缩减后代码:

#include<bits/stdc++.h>
#define in int
using namespace std;
in main() 
{
    for(in i=0;i<=20;i++)
    {
    	for(in j=0;j<=33;j++)
    	{
    		for(in k=0;k<=100;k++)
    		{
				if(k%3==0&&100==i+j+k&&100==i*5+j*3+k/3) 
				{
					cout<<i<<" "<<j<<" "<<k<<endl;
				}
			}
		}
	}
    return 0;
}

成功AC了,但是还可以进一步简化:

方法3:

推荐指数:⭐⭐⭐⭐

三种鸡加起来=100,知二求一,可以省去最内层(其他两层也可以)的求小鸡的循环,通过

100-公鸡-母鸡=小鸡

的等式求出小鸡。

代码:

#include<bits/stdc++.h>
#define in int
using namespace std;
in main() 
{
    for(in i=0;i<=20;i++)
    {
    	for(in j=0;j<=33;j++)
    	{
    		int k=100-i-j; //小鸡
    		if(k%3==0&&100==i+j+k&&100==i*5+j*3+k/3) 
			{
				cout<<i<<" "<<j<<" "<<k<<endl;
			}
		}
	}
    return 0;
}

以上是最优方法

示例2:百钱白鸡2

题目描述

中国数学家张邱建(公元五世纪,其它资料不详),在他的《算经》中提出了著名的“百钱买百鸡”问题:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。百钱买百鸡,问翁、母、雏各几何?

你的任务是:根据给定的钱数 m,和买到的鸡数 n ,输出所有的方案。如果没有可行方案,输出 None 。

输入格式

只有两个整数 m,n(0<m,n<10000)

输出格式

若干行,每行 3 个数,表示一种可行方案,分别表示鸡翁、鸡母、鸡雏的数量。

样例 #1

样例输入 #1

100 100

样例输出 #1

0 25 75
4 18 78
8 11 81
12 4 84

样例输入 #2

100 10

样例输出 #2

None

 跟百钱白鸡1差不多,只不过加了输入输出。

代码:

#include<bits/stdc++.h>
#define in int
#define bl bool
using namespace std;
in main()
{
	in m,n;
	bl f=0;
	cin>>m>>n;
	for(in i=0;i<=n;i++)
	{
		for(in j=0;j<=n;j++)
		{
			in k=n-i-j;
			if(k%3==0&&n==i+j+k&&m==i*5+j*3+k/3) 
			{
				cout<<i<<" "<<j<<" "<<k<<endl;
				f=1;
			}
		}
	}
	if(f==0)
	{
		cout<<"None";
	}
    return 0;
}

标签:输出,百钱,样例,c++,枚举,白鸡,100
From: https://blog.csdn.net/FHY_pp/article/details/142414646

相关文章

  • 【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
    文章目录C++类与对象前言读者须知RVO与NRVO的启用条件如何确认优化是否启用?1.按值传递与拷贝省略1.1按值传递的概念1.2示例代码1.3按值传递的性能影响1.3.1完全不优化1.4不同编译器下的优化表现1.4.1VisualStudio2019普通优化1.4.2VisualStudio2022激进......
  • 【c++】动态内存管理
    ......
  • 大学C++程序设计课程开发指南——开发环境搭建
    前言由于某些大学程序设计课程仍然在使用VC6.0这一上古工具,不太适合学生与现代开发生产接轨,并且也有可能出现兼容问题等,故编写此文,仅供参考。使用VisualStudio在介绍VisualStudio(此后简称VS)前,先给大家介绍这一工具的发展。其前身正是VC6.0(全称VisualC++6.0,二十世纪末和......
  • C++学习笔记(27)
    十一、把字符串转换成整数有两个任务:1)为了支持把C风格的字符串转换成数字,C++提供了以下四个函数:intatoi(constchar*_String);//把C风格字符串转换为int整数。longatol(constchar*_String);//把C风格字符串转换为long整数。longlongatoll(constchar......
  • C++游戏
    宠粉福利!目录1.猜数字2.五子棋3.打怪4.跑酷5.打飞机6.扫雷1.猜数字#include<iostream>#include<cstdlib>#include<ctime>intmain(){std::srand(static_cast<unsignedint>(std::time(0)));//设置随机数种子inttarget=std::rand()%1000+......
  • C++ 多线程知识汇总
    https://zhuanlan.zhihu.com/p/194198073 (防链接失效)程序使用并发的原因有两种:为了关注点分离(程序中不同的功能,使用不同的线程去执行),当为了分离关注点而使用多线程时,设计线程的数量的依据,不再是依赖于CPU中的可用内核的数量,而是依据概念上的设计(依据功能的划分);为了提高性能......
  • C++学习
    C++学习第三课缺省函数、函数重载与引用C++学习第一课:C++学习须知C++学习第二课:命名空间域C++学习第三课:缺省函数与函数重载文章目录C++学习第三课缺省函数、函数重载与引用前言一、C语言的第二个不足:缺省参数(默认参数)的使用1.当函数有两个及以上形参时的传参规......
  • C++ 多态
    一、多态的概念多态简单来说就是多种形态。多态又分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态(静态多态)主要就是我们一般讲的函数重载和函数模板。运行时多态,具体点就是去完成某个行为(函数),可以传不同的对象就会完成不同的行为,就达到多种形态。就像我们买火......
  • 【Py/Java/C++三种语言OD独家2024E卷真题】20天拿下华为OD笔试之【模拟】2024E-转骰子
    可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳od1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录相关推荐阅读题目描述与示例题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明解题思路构建长度为6的数组表......
  • C++顺序结构(2)
    一、变量、赋值语句与表达式1、天安门广场在北京市中心,它南北长880米,东西宽500米,试编一程序,计算天安门广场面积是多少平方米。点击查看代码1//试编程,计算天安门广场的面积是多少平方米2#include<iostream>//包含输入输出流头文件iostream3usingnamespacestd;......