九度1084 整数 拆分

链接:
http://ac.jobdu.com/problem.php?pid=1084

题目描述:

一个整数总可以拆分为2的幂的和,例如:
7=1+2+4
7=1+2+2+2
7=1+1+1+4
7=1+1+1+2+2
7=1+1+1+1+1+2
7=1+1+1+1+1+1+1
总共有六种不同的拆分方式。
再比如:4可以拆分成:4 = 4,4 = 1 + 1 + 1 + 1,4 = 2 + 2,4=1+1+2。
用f(n)表示n的不同拆分的种数,例如f(7)=6.
要求编写程序,读入n(不超过1000000),输出f(n)%1000000000。

思路:
这题重点是思路,我一直想用dfs,可是总是找不到清晰的思路。后来看了题解,发现这个是递推题,找到关系式就好了。

首先,如果这个数是奇数,那么f(n)和f(n-1)的表示结果是一样的。
如果这个数是偶数,分两种情况:第一种,有1参与时,结果和f(n-1)一样;没有1参与时,结果和f(n/2)一样,因为没有1时,拆分的最小单位就是2,这就相当于是(n/2)这个数拆分的每个数*2。

理解了这些,就可以先算好,然后直接从数组取了。

代码如下:

#include <stdio.h>  
using namespace std;
int num[1000002];  

int main(void){  
    int n;  

    num[0] = num[1] = 1;  
    for (int i=1; i<=500000; ++i){  
        num[2*i] = (num[2*i-2] + num[i]) % 1000000000;  
        num[2*i+1] = num[2*i];  
    }  

    while (scanf ("%d", &n) != EOF){  
        printf ("%d\n", num[n]);  
    }  

    return 0;  
} 
发布了56 篇原创文章 · 获赞 49 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/IBelieve2016/article/details/77825543