解题思路:
每对成虫过x个月产y对卵,每对卵要过两个月长成成虫。假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵(过X个月产卵),问过Z个月以后,共有成虫多少对?0≤X≤20,1≤Y≤20,X≤Z≤50。
在这里其实,只知道是类似斐波拉契数列的一类的递推公式,也就是经典的兔子问题。
第i天的兔子=第i-1的兔子+第i-2的兔子
那么这道题的思路也是类似的,其实因为每个虫子从幼虫到成虫要2个月,也就是说,决定第i个月的成虫数量应该是i-1的成虫和i-2的幼虫(因为经过2个月就变成成虫了。)那么,第i个月的幼虫,应该是由第i - z个月的成虫决定的。同时,我们还需要知道一个递推公式,一定会有一个首项,那就是第一个月只有1对成虫。
类比兔子繁殖(斐波那契数列)问题中:当月的成年兔子可以分为上个月就已经是成年的兔子,和这个月刚刚成年的兔子。
考虑某个月的虫,可以分为上个月就已经有的虫(成虫或幼虫),和这个月刚刚从卵变成的幼虫。
第i个月的上个月的虫子数量为a[i-1]。
假设虫卵在第m月出生,那么这些卵会在第m+2月变为幼虫。反过来想,第i个月的刚刚从卵变成的幼虫,实际是第i-2月出生的虫卵。第i-2月出生的虫卵数量为b[i-2],所以这部分幼虫的数量为b[i-2]。
因而有a[i] = a[i-1] + b[i-2];
而这道题题目中要求的是z个月后的成虫个数,即第z+1个月的成虫个数。我们只需定义一个数组a存储每个月成虫的个数。考虑到每个月会有卵变成新的成虫,所以我们还需定义一个数组b存储每个月的新增卵的数量。
递推公式为 a[i] = a[i-1] + b[i-2](第i个月的成虫数量a[i],等于第(i-1)个月的成虫数量a[i-1],加上第(i-2)个月的新增卵数量b[i-2])
参考代码:
#include<iostream>
using namespace std;
int main()
{ //a[i]表示第i个月成虫对数;b[i]表示第i个月虫卵的的对数
long long a[101]={0},b[101]={0},x=0,y=0,z=0;//归零好习惯
cin>>x>>y>>z;
for(i=1;i<=x;i++){a[i]=1;b[i]=0;}
for(i=x+1;i<=z+1;i++) //因为要统计到第z个月后,所以要for到z+1
{
b[i]=y*a[i-x];
a[i]=a[i-1]+b[i-2];//主要程序(递推式)
}
cout<<a[z+1]<<endl;//华丽结束
return 0;
}
0.0分
18 人评分
母牛的故事 (C语言代码)浏览:706 |
Biggest Number (C++代码)回溯法浏览:1658 |
震宇大神的杀毒软件 (C++代码)浏览:1163 |
C语言程序设计教程(第三版)课后习题1.5 (C++代码)浏览:775 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:622 |
校门外的树 (C语言代码)浏览:981 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:613 |
WU-格式化数据输出 (C语言代码)浏览:1814 |
C语言程序设计教程(第三版)课后习题6.6 (C++代码)浏览:645 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:560 |