http://ac.jobdu.com/problem.php?pid=1084
照抄了 http://blog.youkuaiyun.com/jdplus/article/details/18839343
参考了 http://www.cnblogs.com/yinger/archive/2012/08/17/2644312.html
#include <stdio.h>
int main(){
int a[1000002];
int input;
a[0] = a[1] = 1;
for (int i = 1; i <=500000; ++i) {
a[2*i] = (a[2*i-2] + a[i])%1000000000;
a[2*i+1] = a[2*i];
}
while(scanf("%d",&input) !=EOF ){
printf("%d\n",a[input]);
}
}
这道题,如果找不到递推公式,也可以用完全背包的动态规划来做
#include <stdio.h>
#include <cstring>
static int dp[1000001];
int main(){
int n;
while(scanf("%d",&n)!=EOF){
memset(dp,0,sizeof(dp));
dp[0] =1;
for (int i = 0; i < 21; ++i) {
int v = 1<<i;
for (int j = 1; j<=n; ++j) {
if(j-v>=0){
dp[j] = (dp[j-v] + dp[j])%1000000000;
}
}
}
printf("%d\n",dp[n]);
}
}