1算法基本概念--百鸡问题

算法的基本概念


一般来说,算法的好坏直接决定了所实现软件性能的优劣。

通常来说,关于算法有如下几个 方面需要进行考虑

  • 用什么方法来设计算法
  • 所设计算法所需要的资源
  • 需要的运行时间和存储空间
  • 判定一个语法的好坏

算法的定义和特性

算法的定义

算法是解某一特定问题的一组有穷规则的集合

算法的特性

  1. 有限性:算法在有限步后必须终止
  2. 确定性:算法的每一步都有精确意义
  3. 输入:算法有0或多个输入
  4. 输出:算法有一或多个输出
  5. 能行性:算法中所实现的运算都是基本的运算

基础的算法–穷举法

  1. 百鸡问题:

今有鸡翁一,值钱伍;鸡母一,值钱三;鸡鶵三,值钱一。凡百钱买鸡百只,问鸡翁、母、鶵各几何?

这个问题用解析法是比较麻烦的,是一个三元不定方程组,这时就可以用穷举法来解决。

穷举法:

就是从有限集合中,注意列举集合的所有元素,对每个元素逐一进行判断和处理,从而找出问题的解。

void chicken(int n,int &k,int g[],int m[],int s[])
{
	int a,b,c;
	k = 0;
	for (a=0;a<=n;a++){
		for (b=0;b<=n;b++){
        	for (c=0;c<=n;c++){
            	if((a+b+c==n)&&(5*a+3*b+c/3==n)&&(c%3==0)){
                    g[k]=a;
                    m[k]=b;
                    s[k]=c;
                    k++;
                }
       		}
		}
	}
}

该方法的外层循环执行n+1次,中间循环执行(n+1)(n+1)次,内循环执行(n+1)(n+1)(n+1)次,在这个问题中,循环体执行会超过100万次。

如果我们对于这个问题稍作思考和转换,n原钱只能买到n/5只公鸡或者n/3只母鸡,小鸡数量又可以通过公鸡和母鸡数量求出来

void chicken(int n,int &k,int g[],int m[].int s[])
{
    int a,b,c,i,j;
    k = 0;
    i = n/5;
    j = n/3;
    for (a=0;a<=i;a++){
        for (b=0;b<=j;b++){
            c = n - a - b;
            if ((5*a+3*b+c/3==n)&&(c%3==0)){
                a[k]=a;
                m[k]=b;
                s[k]=c;
                k++;
            }
        }
    }
}

n=100时,只会执行(n/5+1)(n/3+1)=714次,减小很多。

然而这并不是问题的最优解,在解决问题时,我们有两个方程

x+y+z=100;

5x+3y+z/3=100;

我们对这个方程组进行消元可得

7x+4y=100;

因为X,Y,Z均不能为负,所以可以轻易得出

x的取值范围是【0,12】==n的取值范围是【0,3】

所以可以进行更少的循环得出问题的结果

#include <stdio.h>
main( )
{	int cocks,hens,chicks;//公鸡、母鸡、小鸡
	for(int n=0;n<=3;n++)
	{	cocks=4*n;
		hens=25-7*n;
		chicks=75+3*n;
		printf("%d,%d,%d\n",cocks,hens,chicks);
	 } 
}

这时候会引出一个新问题

算法复杂度

一般情况下,会用算法的复杂度来衡量一个算法的效率。

算法的复杂度分为

  • 时间复杂度
  • 空间复杂度

一般情况下,对于算法的时间复杂度我们考虑更多。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值