【練習】自然數拆分Lunatic版
阿新 • • 發佈:2018-10-31
Tyvj 1172 自然數拆分Lunatic版
題意:給定一個自然數n(1<= n <= 4000), 要求把自然數n拆分成n個正整數相加的情況(正整數可以重複出現, 但順序不同仍視為同一種情況qaq)
求方案數mod 2147483648的值
完全揹包求方案數(又雙叒叕不開long long 見祖宗)
1 ~ n可以視為n種物品, 每種物品均可無限次使用, 揹包容積為n, 求最終裝滿揹包的方案數
完全揹包板子上!
邊界dp[0] = 1, 最終記得將ans - 1
不開long long 或者 unsigned int 只有一半的分數
#include<cstdio> #include<iostream> using namespace std; const int sz = 4040, mod = 2147483648; int n, ans = 0; unsigned int dp[sz]; int main() { scanf("%d", &n); dp[0] = 1; for(int i = 1; i <= n; i++) for(int j = i; j <= n; j++) dp[j] = (dp[j] + dp[j - i]) % mod;if(dp[n] > 0) ans = dp[n] - 1; else ans = mod; printf("%d", ans); return 0; }