1. 程式人生 > >1312:【例3.4】昆蟲繁殖(遞推演算法)

1312:【例3.4】昆蟲繁殖(遞推演算法)

每對成蟲過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對成蟲。

更多的分析在程式碼裡:

#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
int x, y, z;
ll a[55], b[55];
int main(){
    scanf("%d%d%d", &x, &y, &z);
    for (int i = 1; i <= x; ++i)
        a[i] = 1, b[i] = 0;            //第一個x月的成蟲數量
    for (int i = x + 1
; i <= z + 1; ++i) { b[i] = y*a[i - x]; //在i月的幼蟲只與i-z月前的成蟲有關 a[i] = a[i - 1] + b[i - 2];//第i個月的成蟲只與i-1的成蟲和i-2的幼蟲有關。 } printf("%lld\n", a[z + 1]);//過了z個月 }