2018-07-12发表算法与数据结构1 分钟读完 (大约205个字)0次访问poj 2229 Sumsets原题地址 知识点:DP 解题报告12345678910111213141516171819202122232425262728#include <cstdio>#include <string.h>int sum;int d[1000001];int main() { scanf("%d", &sum); int i; // 初始化唯一确定方案数,d[1] 为 1 表示 1 的分解方案只有 1 种 d[1] = 1; for(i=2;i<=sum;++i) { // 找规律,当 i 为偶数的时候方案数为 i / 2 的方案数再加上 i-1的方案数 // 当 i 为偶数时才体现出 2 的幂之和,因为除了加 1 之外其余加的都是为偶数的2的n次幂,这个是重要的入手点 if ((i & 0x1) == 0) { d[i] = d[i/2]; } // 不论奇偶都要加上他们前一个数的方案数 d[i] += d[i-1]; // WA 的时候仔细再看题目才发现要取一下模 d[i] %= 1000000000; } printf("%d\n", d[sum]); return 0;} 结语重点关注题目数字的特征 poj 2229 Sumsetshttps://blog.tecknight.xyz/2018/07/11/poj-2229-Sumsets/作者马克鱼发布于2018-07-12更新于2025-10-12许可协议#DP