2.3 记录结果再利用的“动态规划” 基础的动态规划算法
将一个数N分解为2的幂之和共有几种分法?
定义dp[i]为i的分解方案数。dp[0] = 2 ^ 0 = 1,递推到 N 。若i为偶数,则dp[i] = dp[i / 2] + dp[i – 1] + 1,否则dp[i] = dp[i – 1] + 1。
#include <iostream> using namespace std; int dp[1000000 + 1]; // 数字i的分解数 ///////////////////////////SubMain////////////////////////////////// int main(int argc, char *argv[]) { #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif int N; cin >> N; dp[0] = 1; // 2^0 for (int i = 1; i <= N; ++i) { if ((i & 0x1) == 0) { dp[i] = dp[ i / 2]; // 将i / 2的每个构成数乘以2,得到i } dp[i] += dp[i - 1]; // 将i - 1的构成数拿过来加一 dp[i] %= 1000000000; } cout << dp[N] << endl; #ifndef ONLINE_JUDGE fclose(stdin); fclose(stdout); system("out.txt"); #endif return 0; } ///////////////////////////End Sub//////////////////////////////////
知识共享署名-非商业性使用-相同方式共享:码农场 » POJ 2229 Sumsets 题解 《挑战程序设计竞赛(第2版)》
您好,您写的解释出错了。不应该有+1
楼主,能给个证明么“定义dp
为i的分解方案数。dp[0] = 2 ^ 0 = 1,递推到 N 。若i为偶数,则dp
= dp[i / 2] + dp[i – 1] + 1,否则dp
= dp[i – 1] + 1。”