基本思想
枚举法又称穷举法。它是根据题意,枚举所有可能的状态,并用问题给定的条件来约束状态,检验那些是需要的、那些是不需要的。
结构
循环+判断语句
框架结构
设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;
}