ACM--枚举算法

例题:百鸡问题:有一个人有一百块钱,打算买一百只鸡。到市场一看,公鸡三块钱一只,母鸡两块钱一个,小鸡一块钱三只。现在,请你编一程序,帮他计划一下,怎么样买法,才能刚好用一百块钱买一百只鸡? 按照枚举算法的思路,首先应该构造可能解的集合: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左右。 从上面的对比可以看出,对于枚举算法,程序优化的主要考虑方向是:通过加强约束条件,缩小可能解的集合的规模。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值