国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C語言之整數劃分問題(遞歸法)實例代碼

2020-01-26 14:14:15
字體:
來源:轉載
供稿:網友

C語言之整數劃分問題(遞歸法)實例代碼

整數劃分問題是算法中的一個經典命題之一,有關這個問題的講述在講解到遞歸時基本都將涉及。所謂整數劃分,是指把一個正整數n寫成如下形式:

    n=m1+m2+...+mi; (其中mi為正整數,并且1 <= mi <= n),則{m1,m2,...,mi}為n的一個劃分。

如果{m1,m2,...,mi}中的最大值不超過m,即max(m1,m2,...,mi)<=m,則稱它屬于n的一個m劃分。這里我們記n的m劃分的個數為f(n,m);

例如但n=4時,他有5個劃分,{4},{3,1},{2,2},{2,1,1},{1,1,1,1};

注意4=1+3 和 4=3+1被認為是同一個劃分。

該問題是求出n的所有劃分個數,即f(n, n)。下面我們考慮求f(n,m)的方法;

1.遞歸法:

   根據n和m的關系,考慮以下幾種情況:

   (1)當n=1時,不論m的值為多少(m>0),只有一種劃分即{1};

   (2)當m=1時,不論n的值為多少,只有一種劃分即n個1,{1,1,1,...,1};

   (3)當n=m時,根據劃分中是否包含n,可以分為兩種情況:

      (a)劃分中包含n的情況,只有一個即{n};

      (b)劃分中不包含n的情況,這時劃分中最大的數字也一定比n小,即n的所有(n-1)劃分。

      因此 f(n,n) =1 + f(n,n-1);

   (4)當n<m時,由于劃分中不可能出現負數,因此就相當于f(n,n);

   (5)但n>m時,根據劃分中是否包含最大值m,可以分為兩種情況:

       (a)劃分中包含m的情況,即{m, {x1,x2,...xi}}, 其中{x1,x2,... xi} 的和為n-m,因此這情況下

          為f(n-m,m)

       (b)劃分中不包含m的情況,則劃分中所有值都比m小,即n的(m-1)劃分,個數為f(n,m-1);

      因此 f(n, m) = f(n-m, m)+f(n,m-1);

      綜上所述:

       f(n, m)=  1;       (n=1 or m=1)        f(n,m)  =  f(n, n);          (n<m)               1+ f(n, m-1);       (n=m)               f(n-m,m)+f(n,m-1);     (n>m)


#include<iostream>using namespace std;int equationCount(int n,int m){  if(n==1||m==1)    return 1;  else if(n<m)    return equationCount(n,n);  else if(n==m)    return 1+equationCount(n,n-1);  else    return equationCount(n,m-1)+equationCount(n-m,m);}int main(void){  int n;  while(scanf("%d",&n)!=EOF&&(n>=1&&n<=120))  {    printf("%d/n",equationCount(n,n));  }  return 0;}

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 张家界市| 景东| 福安市| 楚雄市| 茶陵县| 江安县| 临武县| 民和| 英山县| 彩票| 马鞍山市| 康乐县| 昌乐县| 剑河县| 萨嘎县| 凤庆县| 沙坪坝区| 绥江县| 贡觉县| 荣昌县| 离岛区| 牟定县| 洪泽县| 稻城县| 台东市| 明溪县| 浦县| 德格县| 镇雄县| 涪陵区| 太和县| 湘阴县| 黔西县| 丰顺县| 富顺县| 清水河县| 临沭县| 昌都县| 宜川县| 南皮县| 舒兰市|