題目
將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 #include5view codeusing
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 }
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這道題 剛寫的時候 使...