將乙個整數劃分為多個正整數之和

2022-04-08 06:42:17 字數 828 閱讀 3258

整數劃分問題是將乙個正整數n拆分成一組數連加並等於n的形式,顯然這組數中最大加數不大於n。

令n為需要劃分的整數,m為劃分後的最大整數。例如將6劃分為最大加數為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中劃分方法。若劃分後最大整數為2,則劃分形式為最後兩行,共4種劃分方法。易得可利用遞迴方式求解,設劃分函式split(int n,int m),其中n為需要劃分的整數,m為劃分後的最大加數。

(1) m < 1 或者n < 1時,劃分方式共0種。

(2) m = 1或者n = 1時,劃分方式共1中。

(3) n < m時,因為整數劃分中最大加數不可能大於n,因此此種情況等價為split(n, n)。

(4) m=n時,劃分分為兩種:一種是最大加數為m-1的,共split(n, m-1)中劃分方式;一種是其中乙個加數為m的(當然不存在另乙個加數,或者說另乙個加數為0)。因此,m=n時共split(n, m-1) + 1種劃分方式。

(5) m < n時,同樣存在兩種劃分:一種是最大加數m-1的,共split(n, m-1);另外一種是其中乙個加數為m的,緊接著只需要對n-m進行劃分即可且最大加數為m,因此共split(n - m,m)種劃分方式。因此,m < n時共split(n, m-1) + split(n-m, m)中劃分。

源**如下:

#include

int split(int n, int m)

將乙個整數劃分為多個正整數之和

整數劃分問題是將乙個正整數n拆分成一組數連加並等於n的形式,顯然這組數中最大加數不大於n。令n為需要劃分的整數,m為劃分後的最大整數。例如將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 ...

整數劃分為多數之和

將整數n,劃分為m個整數的和 1 m n 1 le m le n 1 m n 求有多少種加法結果。聯想到抽屜原理 容易得出,兩種極端情況。m n m n m n,抽屜數等於item個數,這意味著只有一種分法 m 1 m 1 m 1,只有乙個抽屜,怎麼分都也是只有一種分法 那麼,就剩下一種最一般的情況...

將乙個正整數L隨機拆分成n個正整數

隨機指定範圍內n個不重複的數 最簡單最基本的方法 param min 指定範圍最小值 param max 指定範圍最大值 param n 隨機數個數 public static int randomcommon int min,int max,int n int result new int n i...