整数划分问题(一)
???????n=m1+m2+...+mi; (其中mi為正整數(shù),并且1 <= mi <= n),則{m1,m2,...,mi}為n的一個劃分。
?????? 如果{m1,m2,...,mi}中的最大值不超過m,即max(m1,m2,...,mi)<=m,則稱它屬于n的一個m劃分。這里我們記n的m劃分的個數(shù)為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的所有劃分個數(shù),即f(n, n)。下面我們考慮求f(n,m)的方法;
??????
??????
?????根據(jù)n和m的關(guān)系,考慮以下幾種情況:
(1)當n=1時,不論m的值為多少(m>0),只有一種劃分即{1};
(2)當m=1時,不論n的值為多少,只有一種劃分即n個1,{1,1,1,...,1};
(3)當n=m時,根據(jù)劃分中是否包含n,可以分為兩種情況:
(a)劃分中包含n的情況,只有一個即{n};
(b)劃分中不包含n的情況,這時劃分中最大的數(shù)字也一定比n小,即n的所有(n-1)劃分。
因此 f(n,n) =1 + f(n,n-1);
(4)當n<m時,由于劃分中不可能出現(xiàn)負數(shù),因此就相當于f(n,n);
(5)但n>m時,根據(jù)劃分中是否包含最大值m,可以分為兩種情況:
(a)劃分中包含m的情況,即{m, {x1,x2,...xi}}, 其中{x1,x2,... xi}?的和為n-m,可能再次出現(xiàn)m,因此是(n-m)的m劃分,因此這種劃分個數(shù)為f(n-m, m);
(b)劃分中不包含m的情況,則劃分中所有值都比m小,即n的(m-1)劃分,個數(shù)為f(n,m-1);
因此 f(n, m) = f(n-m, m)+f(n,m-1);
?
綜合以上情況,我們可以看出,上面的結(jié)論具有遞歸定義特征,其中(1)和(2)屬于回歸條件,(3)和(4)屬于特殊情況,將會轉(zhuǎn)換為情況(5)。而情況(5)為通用情況,屬于遞推的方法,其本質(zhì)主要是通過減小m以達到回歸條件,從而解決問題。其遞推表達式如下:
????源碼如下:
?1?#include?<stdio.h>
?2?int?split(int?n,?int?m)
?3?{
?4?????if(n?<?1?||?m?<?1)?
?5?????return?0;
?6?????if(n?==?1?||?m?==?1)?
?7?????return?1;
?8?????if(n?<?m)?
?9?????return?split(n,?n);
10?????if(n?==?m)?
11?????return?(split(n,?m?-?1)?+?1);
12?????if(n?>?m)?
13?????return?(split(n,?m?-?1)?+?split((n?-?m),?m));
14?}
15?
16?int?main()
17?{
18?????printf("12的劃分數(shù):?%d",?split(12,?12));
19?????return?0;
20?}
21?
轉(zhuǎn)載于:https://www.cnblogs.com/sophist/archive/2009/10/04/1577912.html
總結(jié)
- 上一篇: WDS系列--Windows Deplo
- 下一篇: 测试架构师的目标和价值