题目描述:将一个数N分解为2的幂之和共有几种分法?
题解:定义dp[i]为i的分解方案数。dp[0] = 2 ^ 0 = 1,递推到 N 。若i为偶数,则dp[i] = dp[i / 2] + dp[i – 1] ,否则dp[i] = dp[i – 1]
参考程序:
#include<cstdio>
#define maxn 1000010
int f[maxn];
int main(){
int n;
scanf("%d",&n);
f[0]=1;
for (int i=1;i<=n;i++)
f[i]=f[i-1]+(1-(i&1))*f[i/2],
f[i] %= 1000000000;
printf("%d",f[n]);
return 0;
}