
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。”