整數劃分【DP】

題目鏈接:900. 整數劃分

一個正整數n可以表示成若干個正整數之和,形如:n=n1+n2+…+nk,其中n1≥n2≥…≥nk,k≥1。

我們將這樣的一種表示稱爲正整數n的一種劃分。

現在給定一個正整數n,請你求出n共有多少種不同的劃分方法。

輸入格式
共一行,包含一個整數n。

輸出格式
共一行,包含一個整數,表示總劃分數量。

由於答案可能很大,輸出結果請對10910^9+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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章