(不易)POJ 2229 DP,數的分解

2021-07-11 16:53:10 字數 798 閱讀 9755

題目大意

:給乙個n,n可以分解為2的n次冪之和,如7可以這樣分解:

1) 1+1+1+1+1+1+1 

2) 1+1+1+1+1+2 

3) 1+1+1+2+2 

4) 1+1+1+4 

5) 1+2+2+2 

6) 1+2+4 

一共6種。      輸出n可以分解的種數(結果%1e9)。

分析:

狀態:dp[i]表示i的滿足條件的種數

然後先來看奇數,對於乙個奇數i來說,無論無何怎麼分解都會剩下乙個1,除了這個1之外其他的組合跟i-1是等價的。

所以 dp[i] = dp[i-1]

然後對於偶數i,我們可以把它的分解方式分成2部分,

①分解的數里不含1,以4為例,則有 2+2 和 4 兩種方式,由於不含1且都是2的倍數,我們可以提取乙個公因子2變成了(1+1)*2和(2)*2,此時剛好等價於在 i/2 的分解上乘以2,所以此時的種類為dp[i/2]

②分解的數里含1,所以分解的數里至少含有1個1,我們將這個1先挪到一邊,剩下的剛好就是 i-1所對應的分解種數即

dp[i-1](或dp[i-2]因為i-1為奇數)

所以 dp[i] = dp[i/2] + dp[i-1]

附上**:

#include#includeusing namespace std;

#define y 1000000000

int n;

int dp[1000000+5];

int main()

POJ 2229 Sumsets(遞推,找規律)

構造,遞推,因為劃分是合併的逆過程,考慮怎麼合併。先把n展開成全部為n個1 然後合併,因為和順序無關,所以只和出現次數有關 情況有點多並且為了避免重複,分類,c i 表示序列中最大的數為2 i時的方案數 樹形表示合併 uva 10562 undraw the trees的表示方法。7 2 0 7表示...

poj2229 完全揹包 規律Orz

挑戰dp 題意 被組合數只能是2的整數冪,然後給出乙個數問有多少種組合 mod1e10 思路 完全揹包做啊 還是蠻簡單的 這裡取膜要改成加法,省時間 dp i 代表對於j的方案數 貼一發吧 include include include include include include include...

POJ 2229 Sumsets(找規律,預處理)

題目 參考了別人找的規律再理解 8 1 1 1 1 1 1 1 1 1 1 8 1 1 1 1 1 1 1 2 2 3 8 1 1 1 1 2 2 8 1 1 1 1 4 4 5 8 1 1 2 2 2 8 1 1 2 4 6 7 8 2 2 2 2 8 2 2 4 8 4 4 8 8 8 9 以下...