ACM--枚举算法
来源:互联网 发布:深港通数据 编辑:程序博客网 时间:2024/04/28 11:21
例题:百鸡问题:有一个人有一百块钱,打算买一百只鸡。到市场一看,公鸡三块钱一只,母鸡两块钱一个,小鸡一块钱三只。现在,请你编一程序,帮他计划一下,怎么样买法,才能刚好用一百块钱买一百只鸡? 按照枚举算法的思路,首先应该构造可能解的集合:S={(x,y,z)|0≤x,y,z≤100},其中三元组(x,y,z)表示买公鸡x只,母鸡y只和小鸡z只。因为一共需要买100只鸡,因此,买公鸡、母鸡和小鸡的数量都不会超过100。然后确定验证解的条件:x+y+z=100 and 3x+2y+z/3=100。 下面是解这百鸡问题的程序:
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int i,j,k;
for(i=0;i<100;i++)
for(j=0;j<100;j++)
for(k=0;k<100;k++)
{
if((i+j+k==100)&&(i*3+j*2+k/3==100)&&(k%3==0))
cout<<"买"<<i<<"公鸡,"<<"买"<<j<<"母鸡,"<<"买"<<k<<"小鸡"<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
按照上面的程序,程序需要循环1003次,即|S|=1003。我们通过条件x+y+z=100来约束求解空间,缩小可能解的集合的规模,请看下面的程序:
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int i,j,k;
for(i=0;i<100;i++)
for(j=0;j<100-i;j++)
{
k=100-i-j;
if((i+j+k==100)&&(i*3+j*2+k/3==100)&&(k%3==0))
cout<<"买"<<i<<"公鸡,"<<"买"<<j<<"母鸡,"<<"买"<<k<<"小鸡"<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
程序运行结果相同,但是循环次数为(100*101/2),是程序1循环次数的1/200左右。 从上面的对比可以看出,对于枚举算法,程序优化的主要考虑方向是:通过加强约束条件,缩小可能解的集合的规模。
- ACM--枚举算法
- ACM--枚举--POJ--1753--FilpGame--初期算法
- ACM 算法竞赛 八大基础算法 模拟法 字符串 递归分治 排序 枚举 贪心 递推
- 枚举算法
- 枚举算法
- 枚举算法
- 枚举算法
- 枚举算法
- 枚举算法
- 枚举-算法
- ACM--枚举+DFS/巧妙思想--POJ--2965--The Pilots Brothers' refrigerator--初期算法
- ACM 算法
- ACM算法
- ACM算法
- ACM学习小记____枚举
- ACM:回溯法,枚举排列
- 【ACM之旅】枚举字串
- 【枚举算法】枚举法概念
- 1888. Circular Sequence
- 求生
- Web 设计师的 50 个超便利工具(上)
- Web 设计师的 50 个超便利工具(下)
- 双向链表、队列与栈的C/C++实现
- ACM--枚举算法
- 如何生成比较像样的假数据
- 子线程中定义消息,进行消息循环
- 程序员应知——数据库设计的两个误区
- ACM--回溯算法
- win7 oracle 10g 安装 及 PL/SQL DEVELOPER 安装
- Oracle 常用目录结构(10g)
- ora 12154错误
- 【转】Objective C++介绍