1. 程式人生 > >遞推之三國佚事——巴蜀之危

遞推之三國佚事——巴蜀之危

0
2
265
程式碼:
#include <stdio.h>
#include <stdlib.h>


int main()
{
   int n,i;
   while(scanf("%d",&n) != EOF)
   {
       long long int h[55];  //遞推之類的題目要定義long long int!!!
       h[1] = 0;
       h[2] = 1;
       for(i=3;i<=n;i++)
        h[i] = (i-1)*(h[i-1]+h[i-2]);
       printf("%lld\n",h[n]);

}
    return 0;
}



考慮用遞推:
從簡單的情況開始考慮:
1:一封信,0種方法。
2: 兩封信,一種方法。
當n封信時,第n封信共有n-1种放法。
{
    把第n封信放到k信封裡
  (1)若第k封信放到n的信封裡,則剩下的信有f(n-2)種方法。
  (2) 若第k封信不能放到n的信封裡,(第一封信不能放到第1個信封裡,第2封信不能放到第二個信封裡)
       所以此時剩餘信封共有f(n-1)種方法。


}
於是總結出公式f(n) = (n-1)*(f(n-1)+f(n-2))