整數劃分問題

2021-06-04 23:03:40 字數 1695 閱讀 5804

整數劃分問題是乙個經典問題,幾乎在講演算法設計的書中都會講,下面把主要的思想給總結下。

所謂整數劃分,就是將乙個正整數n劃分為一系列的正整數之和,如將n可以劃分為:(1=

我們該如何找出所有的劃分呢?

我們可以先來看看整數劃分的規律:

譬如正整數:6

劃分情況如下: 6

5+14+2   4+1+1

3+3   3+2+1 3+1+1+1

2+2+2 2+2+1+1 2+1+1+1+1

1+1+1+1+1+1

觀察第一列的數字發現,我們劃分過程中總是按照比6小1,小2,小3,小k,的順序來依次排列它的劃分,第一列找到比6小k的數之後,然後我們再排列剩下的數字。

所以我們只需要找到那些比6小的數字開頭的,這一行的排列的數目,然後把這些行加起來就是所有的結果,注意看每一行,劃分的特徵是,所有的數字都不超過第一列的那個數字,所以我們可以進行如下的嘗試。

我們試圖這樣去思考這個問題:

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

例如當n=4時,他有5個劃分,,,,,;

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

so,該問題變得清晰了,求出n的所有劃分個數,即f(n, n)。

下面我們考慮求f(n,m)的方法;

遞迴法先討論m,n之間的大小關係:

a.當n==1時,m無論為何值,f(n,m)=1

b.當m==1時,n無論為何值,f(n,m)=1

c.當n

d.當m==n時,可以分兩種情況考慮

1.排列中包含n,則f(n,m)=1

2.排列中不包含n,則問題轉化為求f(n,m-1)

根據組合數學中加法規則,應將上述兩種情況加起來

故此種情況下f(n,m)=1+f(n,m-1);

e.當n>m時,應分兩種情況考慮:

1.排列中包含m,則排列為,其中之和為n-m,

我們注意到x1.x2,x3,xk,是不超過m的,所以對於後面這些之和為n-m的元素來                 說,它們的排列數目應該為f(n-m,m)

2.排列中不包含m,則問題轉化為f(n,m-1)

根據組合數學中的加法原則,應將上述情況加起來:

故此情況下的f(n,m)=f(n-m,m)+f(n,m-1);

綜合以上情況,我們可以看出,上面的結論具有遞迴定義特徵,其中a和b屬於回歸條件,c和d屬於特殊情況,將會轉換為情況e。而情況e為 通用情況,屬於遞推的方法,其本質主要是通過減小m以達到回歸條件,從而解決問題。其遞推表示式如下:

f(n, m)=       1;                                (n=1 or m=1)

f(n, n);                         (n

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

f(n-m,m)+f(n,m-1);       (n>m)

因此我們可以給出求出f(n, m)的遞迴函式**如下:

這個是用c++實現的

//整數劃分

#includeusing namespace std;

int partition(int n,int m)

int main(){

int n,m;

while(cout<

整數劃分問題

給定乙個自然數,分成k部分,a1,a2.的數的和,要求a1 a2.求有多少種?原理 整數n拆分成最多不超過m個數的和的拆分數,和n 拆分成最大不超過m的拆分數相等。根據這個原理,原問題就轉化成了求最大拆分為k的拆分個數與最大拆分為k 1的拆分個數的差 f n,k f n,k 1 f n k,k 如下...

整數劃分問題

首先是遞迴解法 整數劃分問題是將乙個正整數n拆成一組數連加並等於n的形式,且這組數中的最大加數不大於n。如6的整數劃分為 65 1 4 2,4 1 1 3 3,3 2 1,3 1 1 1 2 2 2,2 2 1 1,2 1 1 1 1 1 1 1 1 1 1 共11種。下面介紹一種通過遞迴方法得到乙...

整數劃分問題

整數劃分問題 數 n 的劃分是將 n 表示成多個正整數之和的形式 劃分可以分為兩種情況 a 劃分的多個正整數中,正整數的數量是任意的 這又可以分為劃分的正整數中,正整數可以相同與不同兩類 1.劃分的多個正整數可以相同,遞推方程可以表示為 1 dp n m dp n m 1 dp n m m dp n...