题目大意:把一个整数分解为2的幂的和共有几种方案
分析:以6和7为例,
6 = 1+1+1+1+1+1
6 = 1+1+1+1+2
6 = 1+1+2+2
6 = 1+1+4
6 = 2+2+2
6 = 2+4
7 = 1+1+1+1+1+1+1
7 = 1+1+1+1+1+2
7 = 1+1+1+2+2
7 = 1+1+1+4
7 = 1+2+2+2
7 = 1+ 2+4
如果i为奇数的话,表达式里肯定有1,相当于dp[i-1]的所有情况加1,所以dp[i] = dp[i-1]
如果i为偶数的话,表达式是里若有1,则至少有两个1,那么dp[i-2]的所有情况加两个1,就是dp[i]有1的情况。若没有1,则把表达式的项都除以2即可,也就是dp[i/2]了。所以,dp[i] = dp[i-2]+dp[i/2]。
最后别忘了对10^9取模
代码:
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 1000000 + 10;
int dp[maxn];
int main() {
dp[1] = 1;
dp[2] = 2;
for(int i = 3; i <= 1000000; i++) {
if(i%2) dp[i] = dp[i-1];
else dp[i] = dp[i-2] + dp[i/2];
dp[i] = dp[i]%1000000000;
}
int n;
scanf("%d", &n);
printf("%d\n", dp[n]);
return 0;
}