算法一:枚举法

基本思想

枚举法又称穷举法。它是根据题意,枚举所有可能的状态,并用问题给定的条件来约束状态,检验那些是需要的、那些是不需要的。

结构

循环+判断语句

框架结构

设ai1表示状态元素的最小值,aik表示状态元素的最大值(1<=i<=n);即ai1<=a1<=a1k、ai2<=a2<=a2k....

for(a1=a11;a1<=a1k;a1++)

    for(a2=a12;a2<=a2k;a2++)

     ...............................

        for(an=a1n;a2<=ank;an++)

             if(状态a1......an满足检验条件)

                输出问题的解

优缺点

优点:思路简单、程序编写的调试方便

缺点:运算量较大

优化

缩小枚举范围、减小枚举变量、使用其他算法等

技巧

列出枚举的变量、枚举的范围、枚举的判断条件

代码示例

#include <iostream>
using namespace std;
/************************************************************************/
/* 枚举法                                                                */
/* 百钱买百鸡问题                                                        */
/* 公鸡一只五块钱、母鸡一只三块钱、小鸡一块钱三只                        */
/* 现在要用一百块钱买一百只鸡,每种鸡至少一只。问公鸡、母鸡、小鸡各多少只*/
/************************************************************************/


//枚举变量:公鸡、母鸡、小鸡
//枚举范围:公鸡、母鸡、小鸡都是1-100 总计算次数:100*100*100
//枚举判断条件:钱数:5公鸡+3母鸡+1/3小鸡=100
//				鸡数:公鸡+母鸡+小鸡=100
//				小鸡能被3整除
void Calc100_100_100()
{
	cout << "Calc100_100_100" << endl;
	for (unsigned short sCock=1;sCock<100;sCock++)
	{
		for (unsigned short sHen=1 ; sHen <100;sHen++)
		{
			for (unsigned short sChicken=1;sChicken < 100; sChicken++)
			{
				if (5* sCock + 3* sHen + sChicken/3 == 100 && sCock + sHen + sChicken == 100 && sChicken%3 == 0)
				{
					cout << "公鸡" << sCock << "只" << "母鸡" << sHen << "只" << "小鸡" << sChicken << "只"<<endl;
				}
			}
		}
	}
}

//枚举变量:公鸡、母鸡、小鸡
//枚举范围:公鸡:1-100/5
//			母鸡:1-100/3
//			小鸡:1-100
//			总计算次数:20*33*100
//枚举判断条件:钱数:5公鸡+3母鸡+1/3小鸡=100
//				鸡数:公鸡+母鸡+小鸡=100
//				小鸡能被3整除
void Calc20_33_100()
{
	cout << "Calc20_33_100" << endl;
	for (unsigned short sCock = 1; sCock < 20; sCock++)
	{
		for (unsigned short sHen = 1; sHen < 33; sHen++)
		{
			for (unsigned short sChicken = 1; sChicken < 100; sChicken++)
			{
				if (5 * sCock + 3 * sHen + sChicken / 3 == 100 && sCock + sHen + sChicken == 100 && sChicken % 3 == 0)
				{
					cout << "公鸡" << sCock << "只" << "母鸡" << sHen << "只" << "小鸡" << sChicken << "只" << endl;
				}
			}
		}
	}
}

//枚举变量:公鸡、母鸡、小鸡
//枚举范围:公鸡:1-100/5
//			母鸡:1-100/3
//			小鸡:100-公鸡-母鸡
//			总计算次数:20*33*100
//枚举判断条件:钱数:5公鸡+3母鸡+1/3小鸡=100
//				鸡数:公鸡+母鸡+小鸡=100
//				小鸡能被3整除
void Calc20_33()
{
	cout << "Calc20_33" << endl;
	for (unsigned short sCock = 1; sCock < 20; sCock++)
	{
		for (unsigned short sHen = 1; sHen < 33; sHen++)
		{
			unsigned short sChicken = 100 - sCock - sHen;
			if (5 * sCock + 3 * sHen + sChicken / 3 == 100 && sChicken % 3 == 0)
			{
				cout << "公鸡" << sCock << "只" << "母鸡" << sHen << "只" << "小鸡" << (100 - sCock - sHen) << "只" << endl;
			}
		}
	}
}

//枚举变量:公鸡、母鸡、小鸡
//枚举范围:公鸡:1-100/5
//			母鸡:1-100/3
//			小鸡:100-公鸡-母鸡
//			总计算次数:20*33*100
//枚举判断条件:钱数:5公鸡+3母鸡+1/3小鸡=100
//				鸡数:公鸡+母鸡+小鸡=100
//				小鸡能被3整除


//由公鸡+母鸡+小鸡 = 100 和 5公鸡+3母鸡+1/3小鸡=100 推导数学公式:母鸡=(100-7*公鸡)/4 小鸡 = 100-公鸡-母鸡
void Calc20()
{
	cout << "Calc20" << endl;
	for (unsigned short sCock = 1; sCock < 20; sCock++)
	{
		unsigned short sHen = (100 - 7 * sCock) / 4;
		unsigned short sChicken = 100 - sCock - sHen;
		if (5 * sCock + 3 * sHen + sChicken / 3 == 100 && sChicken % 3 == 0)
		{
			cout << "公鸡" << sCock << "只" << "母鸡" << sHen << "只" << "小鸡" << (100 - sCock - sHen) << "只" << endl;
		}
	}
}

int main(int argc, char* argv[])
{
	Calc100_100_100();
	Calc20_33_100();
	Calc20_33();
	Calc20();
	system("pause");
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值