C++递归递推混合

昆虫繁殖

题目描述:科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强。每对成虫过x个月 产y对卵,每对卵要过两个月长成成虫。假设每个成虫不死,第一个月只有一对成虫,且卵 长成成虫后的第一个月不产卵(过x个月产卵),问过z个月以后,共有成虫多少对? 0≤x≤20,1≤y≤20,X≤z≤50 输入: x,y,z的数值。 输出:过z个月以后,共有成虫对数。

输入复制

1 2 8

输出复制

37

#include<bits/stdc++.h>
using namespace std;
long long a[100010]={0};
long long b[100010]={0};
long long c[100010]={0};
int main()
{
	a[1]=1;
	int x,y,z;
	cin>>x>>y>>z;
	for(int i=2;i<=z+1;i++)
	{
		if(i-x<0)b[i]=0;
		else b[i]=a[i-x]*y;
		c[i]=b[i-1];
		a[i]=a[i-1]+c[i-1];
	}
	cout<<a[z+1];
	
	
	return 0;
}

踩方格

题目描述:有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:

a、每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;

b、走过的格子立即塌陷无法再走第二次;

c、只能向北、东、西三个方向走;

请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法 只要有一步不一样,即被认为是不同的方案。输入: 允许在方格上行走的步数n(n≤20)。 输出: 计算出的方案数量。

输入复制

2

输出复制

7

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int a[110]={0};
	a[1]=3;
	a[2]=7;
	for(int i=3;i<=n;i++)
	{
		a[i]=a[i-1]*2+a[i-2];
	}
	cout<<a[n];
	
	
	return 0;
}

判断整除

题目描述:一个给定的正整数序列,在每个数之前都插入+ 号或− 号后计算它们的和。

比如序列:1、2、4 共有8 种可能的序列:

(+1) + (+2) + (+4) = 7

(+1) + (+2) + (-4) = -1

(+1) + (-2) + (+4) =  3

(+1) + (-2) + (-4) = -5

(-1) + (+2) + (+4) = 5

(-1) + (+2) + (-4) = -3

(-1) + (-2) + (+4) = 1

(-1) + (-2) + (-4) = -7

所有结果中至少有一个可被整数k 整除,我们则称此正整数序列可被k 整除。

例如上述序列可以被3、5、7 整除,而不能被2、4、6、8…… 整除。

注意:0、−3、−6、−9…… 都可以认为是3的倍数。

输入:输入的第一行包含两个数:N和K。输出:如果这个正整数序列能被K整除,则输出YES,否则输出NO。(注意:都是大写字母)

输入复制

3 2

1 2 4

输出复制

NO

#include<bits/stdc++.h>
using namespace std;
void func(int,int);
int a[110];
int b[110];
int n,k;
int v;
int main()
{
	cin>>n>>k;
	v=1;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	func(0,0);
	for(int i=1;i<v;i++)
	{
	    if(b[i]%k==0)
	    {
	    	cout<<"YES";
	    	return 0;
		}
	}
	cout<<"NO";
	
	
	return 0;
}
void func(int s,int sum)
{
	int x=a[s];
	int y=a[s]-a[s]*2;
	if(s==n-1)
	{
		if(v%2==0)
		{
			sum=sum+y;
			b[v]=sum;
			v++;
			return;
		}
		else
		{
			sum=sum+x;
			b[v]=sum;
			v++;
			return;
		}
	}
	func(s+1,sum+x);
	func(s+1,sum+y);
}

移动路线

题目描述:X桌子上有一个m行n列的方格矩阵,将每个方格用坐标表示,行坐标从下到上依次递增,列坐标从左至右依次递增,左下角方格的坐标为(1,1), 则右上角方格的坐标为(m,n)。 小明是个调皮的孩子,一天他捉来一只蚂蚁,不小心把蚂蚁的右脚弄伤 了,于是蚂蚁只能向上或向右移动。小明把这只蚂蚁放在左下角的方格 中,蚂蚁从左下角的方格中移动到右上角的方格中,每步移动一个方格。 蚂蚁始终在方格矩阵内移动,请计算出不同的移动路线的数目。 对于1行1列的方格矩阵,蚂蚁原地移动,移动路线数为1;对于1行2列 (或2行1列)的方格矩阵,蚂蚁只需一次向右(或向上)移动,移动路 线数也为1……对于一个2行3列的方格矩阵,如下图所示:

(2,1) (2,2) (2,3)

(1,1) (1,2) (1,3)

蚂蚁共有3种移动路线:

路线1:

(1,1) → (1,2) → (1,3) → (2,3)

路线2:

(1,1) → (1,2) → (2,2) → (2,3)

路线3:

(1,1) → (2,1) → (2,2) → (2,3)

输入 输入只有一行 包括两个整数m和n(0 < m+n ≤ 20), 代表方格矩阵的行数和列数,m、n之间用 空格隔开。 输出 输出只有一行,为不同的移动路线的数目。

输入复制

2 3

输出样例

3

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,m;
	cin>>n>>m;
	int a[110][110]={0};
	for(int i=0;i<n;i++)a[i][0]=1;
	for(int i=0;i<m;i++)a[n-1][i]=1;
	for(int i=n-2;i>=0;i--)
	{
		for(int j=1;j<m;j++)
		{
			a[i][j]=a[i][j-1]+a[i+1][j];
		}
	}
	cout<<a[0][m-1];
	
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值