poj2229 Sumsets(dp)

题意:

给定一个N,只允许使用2的幂次数,问有多少种不同的方案组成N。

题解:

对于n为奇数的时候,dp[n]=dp[n-1],因为一定包含一个1,这个1可以和dp[n-1]的所有情况相加。当n为偶数是,存在两种情况,一种是没有1,一种是两个1,没有1的情况是dp[n/2],存在两个1的情况是dp[n-2]。
    LL dp[maxn];  

void solve(){  
    dp[0] = 1;  
    for(int i = 1;i < maxn;i++){  
        if(i%2 == 1) dp[i] = dp[i-1];  
        else dp[i] = (dp[i-2] + dp[i/2]) % Mod;  
    }  
}  

int main(){  
    int n;  
    solve();  
    while(scanf("%d",&n) != EOF){  
        printf("%d\n",dp[n]);  
    }  
    return 0;  
}  

猜你喜欢

转载自blog.csdn.net/a1561067921/article/details/77850366