题目大意:给一个数n,求把它分解为2的幂的和的方法种数;
解法:递推,可以理解为完全背包,用完全背包的方法转移;
有dp[i]+=dp[i-2^j];注意内外循环的顺序,2^j在外,能避免重复情况;
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int n,dp[1000010],pow_2[22];
int main()
{
scanf("%d",&n);
int size=log(n)/log(2)+1;pow_2[0]=1;
for(int i=1;i<=size;i++) pow_2[i]=pow_2[i-1]*2;
dp[0]=1;
for(int j=0;j<=size;j++)
for(int i=pow_2[j];i<=n;i++)
dp[i]=(dp[i]+dp[i-pow_2[j]])%1000000000;
printf("%d",dp[n]);
return 0;
}