关于斐波那契数列 组合错排问题和一些递推公式合集整理

斐波那契数列 原型:a[n]=a[n-1]+a[n-2],n>=3,a[0]=1,a[1]=1,a[2]=2,a[3]=3,a[4]=5
例题(一)
一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?
我们不妨拿新出生的一对小兔子分析一下:
第一个月小兔子没有繁殖能力,所以还是一对
两个月后,生下一对小兔对数共有两对
三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对
四个月呢?老兔子又生了,之前的一对小兔子也可以繁殖新的一对了,**那么在三对的基础上,又增加了二条,那么,四个月时,共有五条兔子了。满足a[1]=1,a[2]=2,a[3]=3,a[4]=5。**即可写成a[n]=a[n-1]+a[n-2],n>=3形式求解。
(二)有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
心得;第一步先要将前4级台阶的走法手写或心算分析一下,经过发现符合a[n]=a[n-1]+a[n-2],n>=3,a[0]=1,a[1]=1,a[2]=2,a[3]=3,a[4]=5,那么我们直接套用即可。
或者运用推理的方法:
我们在到达最后n层时,最后可以跨一步,也可以跨两步。当我们跨一步时,我们在n-1层,那么会有f(n-1)种的走法;当我们跨两步时,我们在n-2层,那么会有f(n-2)种的走法(走两个一步的情况已经被第一种包括)。两种情况取合则有f(n)=f(n-1)+f(n-2)种情况。//**处理这种问题,分类的点很很关键!**附上代码

#include<stdio.h>
int main()
{
	
long i,n,m,a[101];
	scanf("%ld",&n);
	a[1]=1;
	a[2]=2;
	a[3]=3;
	while(n--)
	{  scanf("%ld",&m);
		for(i=4;i<=m;i++)
		a[i]=a[i-1]+a[i-2];		
		printf("%ld\n",a[m-1]);//要注意已经在第一级上了
	}
	
	
	
	return 0;
	
	
	
	}

组合错排问题
组合的定义:从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号 C(n,m) 表示。
计算公式:在这里插入图片描述
C(n,m)=C(n,n-m)。(n≥m)
错排隶属离散数;
第一步,考虑第n个元素,把它放在某一位置,比如位置k,一共有n-1种排法。
第二步,考虑第k个元素,若是将k放在原来第n个元素的位置,则剩下的n-2个元素错排即可,共有f(n-2)种排法;若是将k放在其它的位置上,则有n-1个元素可以进行错排,共有f(n-1)种排法。
综合两种情况,共有(n-1)(f(n-1)+f(n-2))个排法.
例题;

HDU 2006’10 ACM contest的颁奖晚会隆重开始了!
为了活跃气氛,组织者举行了一个别开生面、奖品丰厚的抽奖活动,这个活动的具体要求是这样的:
首先,所有参加晚会的人员都将一张写有自己名字的字条放入抽奖箱中;
然后,待所有字条加入完毕,每人从箱中取一个字条;
最后,如果取得的字条上写的就是自己的名字,那么“恭喜你,中奖了!”
大家可以想象一下当时的气氛之热烈,毕竟中奖者的奖品是大家梦寐以求的Twins签名照呀!不过,正如所有试图设计的喜剧往往以悲剧结尾,这次抽奖活动最后竟然没有一个人中奖
我的神、上帝以及老天爷呀,怎么会这样呢
不过,先不要激动,现在问题来了,你能计算一下发生这种情况的概率吗?

不会算?难道你也想以悲剧结尾?!

    Input
    输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(1<n<=20),表示参加抽奖的人数。 





    Output
    对于每个测试实例,请输出发生这种情况的百分比,每个实例的输出占一行, 结果保留两位小数(四舍五入),具体格式请参照sample output。 





    Sample Input
    1
    2

    Sample Output
    50.00%
思路;**用全错的情况除以所有可能,即为出现情况的概率**。

#include<stdio.h>
int main()
{
    int n,i,t;
   double a[21],r;	
	while(~scanf("%d",&n))
	{
		while(n--)
		{a[1]=0;
		a[2]=1;
			scanf("%lf",&r);
			t=r;//无人中奖就是全错
			for(i=3;i<=r;i++)
			a[i]=(i-1)*(a[i-1]+a[i-2]);//离散错排问题
			for(i=r-1;i>=1;i--)
			r=r*i;
			printf("%.2lf%%\n",(a[t]/r)*100);
		}	
	}
			return 0;
			
			
			
			}
		

三 递推问题~
以题带点
例题
今年的ACM暑期集训队一共有18人,分为6支队伍。其中有一个叫做EOF的队伍,由04级的阿牛、XC以及05级的COY组成。在共同的集训生活中,大家建立了深厚的友谊,阿牛准备做点什么来纪念这段激情燃烧的岁月,想了一想,阿牛从家里拿来了一块上等的牛肉干,准备在上面刻下一个长度为n的只由"E" “O” "F"三种字符组成的字符串(可以只有其中一种或两种字符,但绝对不能有其他字符),阿牛同时禁止在串中出现O相邻的情况,他认为,"OO"看起来就像发怒的眼睛,效果不好。

你,NEW ACMer,EOF的崇拜者,能帮阿牛算一下一共有多少种满足要求的不同的字符串吗?

PS: 阿牛还有一个小秘密,就是准备把这个刻有 EOF的牛肉干,作为神秘礼物献给杭电五十周年校庆,可以想象,当校长接过这块牛肉干的时候该有多高兴!这里,请允许我代表杭电的ACMer向阿牛表示感谢!

再次感谢!
有趣的递推公式~分析一下
首先分类,如果第n个字符为O,那么第n-1个数就有两种情况,这时一共f(n-2)种排法,共2f(n-2)个排法
如果第n个字符不为O,那么就有f(n-1)种排法。共有f(n)=2
(f(n-2)+f(n-1))个排法~~
附上代码

    Input
    输入数据包含多个测试实例,每个测试实例占一行,由一个整数n组成,(0<n<40)。 



    Output
    对于每个测试实例,请输出全部的满足要求的涂法,每个实例的输出占一行。 



    Sample Input
    1
    2

    Sample Output
    3
    8
#include<stdio.h>
int main()
{
	long long a[100],i,n;
	while(~scanf("%lld",&n))
	{
		
		a[1]=3;
		a[2]=8;
		
		for(i=3;i<=n;i++)
          a[i]=(a[i-1]+a[i-2])*2;

		printf("%lld\n",a[n]);
		
	}
		
	return 0;
	
}

猜你喜欢

转载自blog.csdn.net/weixin_43960370/article/details/88407758