链接:
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;
}