整數的拆分

2022-05-07 14:27:13 字數 1765 閱讀 5173

引自:

華師大oj 1009

問題描述:

將正整數n表示成一系列正整數之和:n=n1+n2+…+nk, 其中n1≥n2≥…≥nk≥1,k≥1。 正整數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。 

輸入:

第一行是測試資料的數目m(1<=m<=10)。以下每行均包含乙個整數n(1<=n<=10)。

輸出:

輸出每組測試資料有多少種分法。

分析:

對於整數劃分,相當於把正整數n寫成下面形式:

n=n1+n2+…+nk (其中n≥n1≥n2≥…≥nk≥1,k≥1),則為n的乙個劃分。

現假設n1 <= m,即:中最大的數不超過m,則稱是n的乙個m上限劃分。記n的m上限劃分為f(n,m)。因此,此題的解便是f(n,n)。對於f(n,m),分析可得下面的遞推關係式:

1、當n = 1時,f(n,m)=1。即1只有這一種劃分。

2、當m = 1時,f(n,m)=1。即此時只有(共n個1)這一種劃分。

3、當m = n時,f(n,m) = f(n,n) = f(n, n-1) + 1。其中"+1"對應的就是這種劃分,其他的劃分中,必定所有數都小於n。

4、當m > n時, f(n,m) = f(n,n),因為n的劃分中不可能存在大於n的數。

5、當m < n時, f(n,m) = f(n-m, m) + f(n, m-1)。其中f(n-m,m)表示包含m的劃分,f(n,m-1)表示不包含m的劃分。

**:

根據上面的遞推式,同樣可以寫出遞迴和遞推的**。

遞迴**仍然存在重複計算,時間代價大。

遞推**就是計算f(1,1)到f(n,n)的過程,所以時間和空間複雜度都是o(n^2),而且由於f(n,m)是和f(n-m,m)、f(n,m-1),所以不太適合進行空間複雜度的優化。

1 #include 2 #include 

3int fun(int n, intm)4

10int

main()

16return0;

17 }//

超時

//超時改進,在計算的過程中記錄一些已經算過的值,避免重複的計算

#include #include 

int dp[105][105];//

把計算過的fun(n,m)存下來

bool flag[105][105

];int fun(int n, int

m)

else

if(n ==m)

else

}int

main()

else

if(j==1

) }

} for(i=1;i<=100;i++)

while(scanf("

%d", &n)!=eof)

return0;

}

整數的拆分

母函式將問題轉換為關於母函式的某種代數問題甚至變成關於母函式的某種形式的運算,以整數拆分為例.所謂的整數拆分,即將正整數n分解成 若干正整數的和,不考慮其求和的順序,一般假定 n n 1 n 2 cdots n k,n 1 geq n 2 geq n 3 geq cdots geq n k 而且分解...

整數的拆分

整數拆分分為有序拆分和無序拆分 有序拆分 把n拆分為 r個數,就相當於把n個球用 r 1塊隔板插入到n 1個空隙裡 c r 1,n 1 放球模型,把n個無區別的球放入到r個有區別的盒子裡,每個盒子至少乙個。無序拆分 把n拆分為 r個數,把n個相同的球放入到r個相同的盒子裡,允許盒子為空。把n個相同的...

整數的拆分2

方法二 母函式 下面我們從另乙個角度,即 母函式 的角度來考慮這個問題。所謂母函式,即為關於x的乙個多項式g x 有g x a0 a1 x a2 x 2 a3 x 3 則我們稱g x 為序列 a0,a1,a2,的母函式。關於母函式的思路我們不做更過分析。我們從整數劃分考慮,假設n的某個劃分中,1的出...