1. 程式人生 > >【練習】自然數拆分Lunatic版

【練習】自然數拆分Lunatic版

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; }