如果i为奇数:肯定有一个1,把dp[i-1]的每一种情况加一个1就得到dp[i],所以dp[i]=dp[i-1]
如果i为偶数:(有两种情况)
如果有1,至少有两个,则dp[i-2]的每一种情况加两个1,就得到i,
如果没有1,则把分解式中的每一项除2,则得到dp[i/2],
如果i为偶数:(有两种情况)
如果有1,至少有两个,则dp[i-2]的每一种情况加两个1,就得到i,
如果没有1,则把分解式中的每一项除2,则得到dp[i/2],
所以dp[i]=dp[i-2]+dp[i/2]
#include <cstdio>
#include <algorithm>
using namespace std;
int n;
int dp[1000010]={0,1,2};
int main()
{
for (int i=3;i<=1000000;i++) {
if (i&1) dp[i]=dp[i-1];
else {
dp[i]=dp[i-2]+dp[i/2];
dp[i]%=1000000000;
}
}
while (~scanf ("%d",&n)) {
printf ("%d\n",dp[n]);
}
return 0;
}