給出乙個整數n,將n分為若干個不同整數的和,求有多少種不同的劃分方式
dp設f[i][j]表示用i個數組成j的方案數,因為n<=50000,而且劃分出來的數要不同,所以最多只能分成320(還要小一點)個數的和,所以i最大為320
轉移=f[i][j-i]+f[i-1][j-i]
前者表示j分成的i個數中不包括1的方案數(因為將j-i相當於將i個數都-1,自然一開始就不可能有1)
後者表示j分為的i個數中包括1的方案數(因為原本有1,所以-1之後就變成了i-1個數了)
這轉移卡了一會,有點菜。。
#include#include#include
#include
#include
using
namespace
std;
typedef
long
long
ll;int f[410][51000],mod=1e9+7
;int
main()
}int ans=0
;
for(int i=1;i<=320;i++) ans=((ll)ans+(ll)f[i][n])%mod;
printf(
"%d\n
",ans);
return0;
}
51nod 1201 整數劃分
將n分為若干個不同整數的和,有多少種不同的劃分方式,例如 n 6,共4種。由於資料較大,輸出mod 10 9 7的結果即可。1 n 50000 直接一看就想到是一道最簡單揹包問題 但n 50000 然後我就直接上揹包,結果毫無疑問的超時,然後我的乙個夥伴在打二維揹包暴力時手抖打錯打出了正解 我們設f...
51nod 1201 整數劃分
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 i j dp i j j dp i j j 1 dp i j 表示將i分成j個不相等的數的個數。dp i j j dp i j 表示給原先的j個數各加一 dp i j j 1 dp i j 表示給原先的j 1的數加1,再附帶個1.因為不相等的數,所以n n 1 2 5e4 5,n...