整數劃分演算法

2021-10-24 22:17:43 字數 1509 閱讀 3039

將正整數n表示成一系列正整數之和:n=n1+n2+…+nk,

其中n1≥n2≥…≥nk≥1,k≥1。

正整數n的這種表示稱為正整數n的劃分。

輸入:乙個正整數n

輸出:n不同劃分個數以及n的劃分結果。

例如正整數6有如下11種不同的劃分:

6;5+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

採用分治思想n本身作為一種劃分即為一種,加上剩下種類的個數

即將分割為兩層,並不斷的遞迴

這裡我們就可以得到乙個函式q(n,m)表示對n進行劃分,出現的最大的整數大小不超過m

得到計算劃分個數的**

#include

using namespace std;

//q(n,m)對數n進行劃分,最大的數不超過m

intq

(int n,

int m)

if(m>n)

return

q(n,n);if

(n==m)

return

q(n-m,m)+q

(n,m-1)

;}intmain()

借用棧的思想,將劃分的結果存入棧中

得到計算劃分結果的**

#include

using namespace std;

//q(n,m)對數n進行劃分,最大的數不超過m

const

int n=

100;

int _stack[n]

;int top=0;

intq

(int n,

int m)

else

if(n>

1&& m==1)

}if(top!=0)

cout<

while

(_stack[top-1]

==1) top--;}

return1;

}if(m>n)

return

q(n,n);if

(n==m)

cout<

while

(_stack[top-1]

==1) top--;}

return1+

q(n,m-1)

;}_stack[top++

]=m;

return

q(n-m,m)+q

(n,m-1)

;}intmain()

整數劃分演算法原理與實現

整數劃分問題是將乙個正整數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的形式,且這組數中的最大加數不大於n。如6的整數劃分為 6 5 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的形式,且這組數中的最大加數不大於n。如6的整數劃分為 6 5 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種。下面介紹一種通過遞迴方法得到乙個正整數的劃分...