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左右。 从上面的对比可以看出,对于枚举算法,程序优化的主要考虑方向是:通过加强约束条件,缩小可能解的集合的规模。

原创粉丝点击