POJ 2229 Sumsets(递推,思考)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2229 Sumsets(递推,思考)相关的知识,希望对你有一定的参考价值。

/*

n = 7
1) 1+1+1+1+1+1+1
2) 1+1+1+1+1+2
3) 1+1+1+2+2
4) 1+1+1+4
5) 1+2+2+2
6) 1+2+4
*/

/*
若i为偶数 : 若有 1 ,至少有两个 ---->f[i-2]的情况+两个1,
若没有1 , 将偶数分解/2-----> f[i/2];
则dp[i] = dp[i / 2] + dp[i-2]

若i为奇数: 必定有 1,
dp[i] = 减去1的序列,加上1
则dp[i] = dp[i – 1]
*/

 

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 
 5 #include<string> 
 6 #include<vector>
 7 #include<set>
 8 #include<map>
 9 #include<queue>
10 #include<math.h>
11 
12 #include<algorithm>
13 #include<iostream>
14 
15 const int INF = 0x7f7f7f7f;
16 using namespace std;
17 typedef long long ll;
18 
19 int dp[1000005];
20 int main(){
21 
22     /*
23         若i为偶数 : 若有  1 ,至少有两个    ---->f[i-2]的情况+两个1, 
24                     若没有1 , 将偶数分解/2-----> f[i/2];
25           则dp[i] = dp[i / 2] + dp[i-2]
26            
27           若i为奇数: 必定有 1, 
28             dp[i] = 减去1的序列,加上1 
29           则dp[i] = dp[i – 1]   
30     */
31     int n;
32     dp[0] = 0;
33     dp[1] = 1;
34     dp[2] = 2;
35     for(int i = 3 ; i <= 1000000 ; i ++){
36         if(i&1) dp[i] = dp[i-1]%1000000000;
37         else dp[i] = (dp[i-2]+dp[i/2])%1000000000;
38     }
39     while(scanf("%d",&n) != EOF && n){
40         printf("%d\n",dp[n]%1000000000);
41     }
42     
43     return 0;
44 }

 

以上是关于POJ 2229 Sumsets(递推,思考)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2229 Sumsets

POJ 2229 Sumsets(规律)

POJ 2229(Sumsets)

POJ 2229 Sumsets(简单DP)

POJ 2229 Sumsets

poj 2229 Sumsets 完全背包求方案总数