題目鏈接:900. 整數劃分
一個正整數n可以表示成若干個正整數之和,形如:n=n1+n2+…+nk,其中n1≥n2≥…≥nk,k≥1。
我們將這樣的一種表示稱爲正整數n的一種劃分。
現在給定一個正整數n,請你求出n共有多少種不同的劃分方法。
輸入格式
共一行,包含一個整數n。
輸出格式
共一行,包含一個整數,表示總劃分數量。
由於答案可能很大,輸出結果請對+7
取模。
數據範圍
1≤n≤1000
輸入樣例:
5
輸出樣例:
7
程序說明:
f[i][j]表示把 i 劃分成 j 個部分之和的方案數,可以根據劃分成的 j 部分裏是否有1來討論,如果有1則狀態轉移爲f[i - 1][j - 1]。如果沒有1則轉移狀態爲f[i - j][j],相當於先在每一個位置放一個1,再把 i - j 劃分成 j 個部分。
代碼如下:
#include <iostream>
using namespace std;
const int N = 1010, M = 1e9 + 7;
int f[N][N], n;
int main() {
cin>>n;
f[0][0] = 1;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= i; j++) {
f[i][j] = f[i - 1][j - 1] + f[i - j][j];
}
int res = 0;
for(int i = 1; i <= n; i++)
res = (f[n][i] + res) % M;
cout<<res<<endl;
return 0;
}