題目大意
:給乙個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 以下...