nyoj 176 整數劃分(二) dp

2021-08-18 02:32:13 字數 1335 閱讀 6217

題目鏈結

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:3描述

把乙個正整數m分成n個正整數的和,有多少種分法?

例:把5分成3個正正數的和,有兩種分法:

1 1 3

1 2 2輸入

第一行是乙個整數t表示共有t組測試資料(t<=50)

每組測試資料都是兩個正整數m,n,其中(1<=n<=m<=100),分別表示要拆分的正數和拆分的正整數的個數。

輸出輸出拆分的方法的數目。

樣例輸入

2

5 25 3

樣例輸出

2

2

**[張云聰]原創

暴力應該會炸吧(聽說)。

首先 對於劃分(n,m),其結果可分為含有1和不含有1

例如對於6分解為3組  (6,3) 有 1,1,4  1,2,3  2,2,2

其中1,1,4  1,2,3為含有1的, 2,2,2為不含有1的。

這樣分有什麼用呢? 

顯然如果對含有1的分法,去掉乙個1後變為 1,4 和2,3。這就變成了(5,2),也就是說 (6,3) 有一部分可以有(5,2)得來

對於不含有1的分法,我們可以同時減去1變成 1,1,1 這就變成了(3,3)

也就是說 (6,3)=(5,2)+(3,3)

那麼對於(5,2),(3,3)均可應用上面的遞推得到他的表示,直到(1,1)=1

從而得到 (n,m)=(n-1,m-1)+(n-m,m)

這樣遞推式就出來了

然後你想遞迴也好dp也好都可以了

**如下

#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

const int maxn = (int)(1e5) + 100;

const int inf = 0x3f3f3f3f;

const int mod = 2520;

const double eps = 1e-3;

typedef long long ll;

typedef unsigned long long ull;

int dp[111][111];

int main()

} int t;

scanf("%d", &t);

while (t--)

return 0;

}

NYOJ 176 整數劃分(二) (dp)

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 把乙個正整數m分成n個正整數的和,有多少種分法?例 把5分成3個正正數的和,有兩種分法 1 1 3 1 2 2 輸入 第一行是乙個整數t表示共有t組測試資料 t 50 每組測試資料都是兩個正整數m,n,其中 1 n m 100 ...

NYOJ 176 整數劃分(二)

整數劃分 二 時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述把乙個正整數m分成n個正整數的和,有多少種分法?例 把5分成3個正正數的和,有兩種分法 1 1 3 1 2 2 輸入第一行是乙個整數t表示共有t組測試資料 t 50 每組測試資料都是兩個正整數m,n,其中 1 n m...

nyoj 176 整數劃分(二)

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述輸入 第一行是乙個整數t表示共有t組測試資料 t 50 每組測試資料都是兩個正整數m,n,其中 1 n m 100 分別表示要拆分的正數和拆分的正整數的個數。輸出輸出拆分的方法的數目。樣例輸入 2 5 25 3 樣例輸出 2 2 ...