题解 【提高】圣诞礼物gift

清晨,大地穿上了薄薄的白棉袄,小T一路哼着歌踏着雪来到了学校,哇:一棵五彩缤纷的圣诞树顿时映入眼帘!树上彩带迎风飘扬,校园里人流如潮,同学们一个个伸长了手在喊:“我要,我要!”咦?他们在干什么?小T奋力挤了进去,发现是一位穿着节日盛装的圣诞老人被大家围在中间,只见圣诞老人戴着可爱的红帽子,背着一个鼓鼓囊囊的大礼包正准备发礼物呢!小T见圣诞老人都快被大家挤得喘不过气来了,就立刻上前维持秩序,他将现场的同学排成一排等待圣诞老人发放礼物。圣诞老人的礼物有两种,一种是苹果,另一种是磁铁。由于磁铁之间有磁力,两个相邻的同学如果拿到的都是磁铁,他们就会被吸在一起而无法分开,苹果则不存在这个问题。圣诞老人想给这一排N个同学每人发一件礼物,同时又要避免相邻两个同学都拿到磁铁的情况,请问他有多少种发放礼物的方案? 你可以认为圣诞老人的大礼包中有足够多的苹果和足够多的磁铁,不会发生某种礼物发到后来不够用的情况。

输入
仅有一行包含一个自然数N,表示共有N个同学。

输出
仅有一行包含一个自然数,表示圣诞老人发放礼物的方案数。清晨,大地穿上了薄薄的白棉袄,小T一路哼着歌踏着雪来到了学校,哇:一棵五彩缤纷的圣诞树顿时映入眼帘!树上彩带迎风飘扬,校园里人流如潮,同学们一个个伸长了手在喊:“我要,我要!”咦?他们在干什么?小T奋力挤了进去,发现是一位穿着节日盛装的圣诞老人被大家围在中间,只见圣诞老人戴着可爱的红帽子,背着一个鼓鼓囊囊的大礼包正准备发礼物呢!小T见圣诞老人都快被大家挤得喘不过气来了,就立刻上前维持秩序,他将现场的同学排成一排等待圣诞老人发放礼物。圣诞老人的礼物有两种,一种是苹果,另一种是磁铁。由于磁铁之间有磁力,两个相邻的同学如果拿到的都是磁铁,他们就会被吸在一起而无法分开,苹果则不存在这个问题。圣诞老人想给这一排N个同学每人发一件礼物,同时又要避免相邻两个同学都拿到磁铁的情况,请问他有多少种发放礼物的方案? 你可以认为圣诞老人的大礼包中有足够多的苹果和足够多的磁铁,不会发生某种礼物发到后来不够用的情况。

输入
仅有一行包含一个自然数N,表示共有N个同学。

输出
仅有一行包含一个自然数,表示圣诞老人发放礼物的方案数。清晨,大地穿上了薄薄的白棉袄,小T一路哼着歌踏着雪来到了学校,哇:一棵五彩缤纷的圣诞树顿时映入眼帘!树上彩带迎风飘扬,校园里人流如潮,同学们一个个伸长了手在喊:“我要,我要!”咦?他们在干什么?小T奋力挤了进去,发现是一位穿着节日盛装的圣诞老人被大家围在中间,只见圣诞老人戴着可爱的红帽子,背着一个鼓鼓囊囊的大礼包正准备发礼物呢!小T见圣诞老人都快被大家挤得喘不过气来了,就立刻上前维持秩序,他将现场的同学排成一排等待圣诞老人发放礼物。圣诞老人的礼物有两种,一种是苹果,另一种是磁铁。由于磁铁之间有磁力,两个相邻的同学如果拿到的都是磁铁,他们就会被吸在一起而无法分开,苹果则不存在这个问题。圣诞老人想给这一排N个同学每人发一件礼物,同时又要避免相邻两个同学都拿到磁铁的情况,请问他有多少种发放礼物的方案? 你可以认为圣诞老人的大礼包中有足够多的苹果和足够多的磁铁,不会发生某种礼物发到后来不够用的情况。

输入
仅有一行包含一个自然数N,表示共有N个同学。

输出
仅有一行包含一个自然数,表示圣诞老人发放礼物的方案数。清晨,大地穿上了薄薄的白棉袄,小T一路哼着歌踏着雪来到了学校,哇:一棵五彩缤纷的圣诞树顿时映入眼帘!树上彩带迎风飘扬,校园里人流如潮,同学们一个个伸长了手在喊:“我要,我要!”咦?他们在干什么?小T奋力挤了进去,发现是一位穿着节日盛装的圣诞老人被大家围在中间,只见圣诞老人戴着可爱的红帽子,背着一个鼓鼓囊囊的大礼包正准备发礼物呢!小T见圣诞老人都快被大家挤得喘不过气来了,就立刻上前维持秩序,他将现场的同学排成一排等待圣诞老人发放礼物。圣诞老人的礼物有两种,一种是苹果,另一种是磁铁。由于磁铁之间有磁力,两个相邻的同学如果拿到的都是磁铁,他们就会被吸在一起而无法分开,苹果则不存在这个问题。圣诞老人想给这一排N个同学每人发一件礼物,同时又要避免相邻两个同学都拿到磁铁的情况,请问他有多少种发放礼物的方案? 你可以认为圣诞老人的大礼包中有足够多的苹果和足够多的磁铁,不会发生某种礼物发到后来不够用的情况。

输入
仅有一行包含一个自然数N,表示共有N个同学。

输出
仅有一行包含一个自然数,表示圣诞老人发放礼物的方案数。

分析完题目后,可以得出:这是一道典型递归题。
至于递归公式,是这样的:

long long f(int n){
	if(a[n])          
		return a[n];
	if(n==1) 	 
		return a[n]=2; 
	if(n==2)   
        return a[n]=3;
    return a[n]=f(n-1)+f(n-2);
}

主函数比较简单:

cin>>n;
	cout<<f(n);

完整代码:

#include<bits/stdc++.h>
using namespace std;
long long a[95];
long long n;
long long f(int n){
	if(a[n])          
		return a[n];
	if(n==1) 	 
		return a[n]=2; 
	if(n==2)   
        return a[n]=3;
    return a[n]=f(n-1)+f(n-2);
}
int main(){
	cin>>n;
	cout<<f(n);
	return 0;
}
上一篇:SQL变量小练习


下一篇:016、列表切片 和 reverse 反转,是否产生新的列表