51mod 1201 整數劃分 dp

2022-05-20 04:28:30 字數 934 閱讀 8821

題目

將n分為若干個不同整數的和,問有多少種不同的劃分方式,例如:n = 6, ,共4種。由於資料較大,輸出mod 10^9 + 7的結果即可。

很容易想到01揹包,由於要求每個整數都不同,故每個整數就可以看作物品

f[i][j]表示在1~i的整數中選擇若干個,和為j的方案數

f[i][j]=f[i-1][j]+f[i-1][j-i](取/不取i)

然而n<=50000,無法解決

至此就束手無策了,看了題解之後不得不感嘆這個神奇的狀態轉移方式

首先需要想到的是:和為n的整數個數,最多也只能為sqrt(n*2);(證法先留個坑) 

f[i][j]表示用了i個數字,和為j的方案數

則將轉移情況分為兩種:

1)取i,f[i][j]=f[i-1][j-i];

2)不取i,將f[i][j-i]每個數都加1

f[i][j]=f[i-1][j-i]+f[i][j-i]

還有乙個類似的狀態轉移poj1664

1 #include2 #include3 #include4 #include5

using

namespace

std;67

const

int m=1e9+7;8

const

int maxn=50000;9

intn;

10int f[320

][maxn];

11int

main()20}

21int ans=0;22

for (int i=1;i<=uline;i++)

23 ans=(ans+f[i][n])%m;

24 printf("%d"

,ans);

25return0;

26 }

view code

51nod 1201 整數劃分 dp

1201 整數劃分 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 將n分為若干個不同整數的和,有多少種不同的劃分方式,例如 n 6,共4種。由於資料較大,輸出mod 10 9 7的結果即可。input 輸入1個數n 1 n 50000 output 輸出劃分的數...

51nod 1201 整數劃分 dp

題解 顯然是一道dp,不妨設dp i j 表示數字i分成j個一共有幾種分法。那麼轉移方程式為 dp i j dp i 1 j dp i 1 j 1 表示將i 1劃分為j個數,然後j個數都 1 還是不重複,將i 1劃分為j 1個數,然後j 1個數都 1,再加上1這個數。然後就是j的範圍要知道1 2 3...

整數劃分 51Nod 1201 (經典dp)

將n分為若干個不同整數的和,有多少種不同的劃分方式,例如 n 6,共4種。由於資料較大,輸出mod 10 9 7的結果即可。input 輸入1個數n 1 n 50000 output 輸出劃分的數量mod 10 9 7。sample input 6sample output 4這道題 剛寫的時候 使...