问题:任何整数必定能分解成2的幂之和,给定整数n,求n的此类分解方法的数量。
2的幂有:1,2,4,8,16,32,64,128......除了1是奇数之外,其他全部为偶数。
比如n = 7时,共有6种分解方法。
7=1+1+1+1+1+1+1
=1+1+1+1+1+2
=1+1+1+2+2
=1+2+2+2
=1+1+1+4
=1+2+4
思路:很显然要采用从小到大的递推方法。
f(1) = 1
f(2m+1) = f(2m) 因为奇数整数2m+1的每种分解方式中都必然含有至少一个1,当把每种分解方式都去掉1时,就得到2m的分解方式,而且2m不会再有其他分解方式,否则2m+1也会再有的。
f(2m) = f(2m-1) + f(m) 偶数整数2m的分解方式中可能有1,也可能没有1。如果有1,那一定会有偶数个1。现在把有1和无1分成两部分。
先看有1的那部分,当把这部分里每个分解方式都去掉1,就得到2m-1的分解方式,并且2m-1不会再有其他分解方式,否则2m也会再有的。
然后再看无1的那部分,因为没有1,所以所有的分解方式都全是2的倍数,当把这部分里每种分解方式都除以2时,这就相当于全是m的分解方式。
由上面两个递推式加上初始条件,即可由n求出f(n)。
void main()
{
int n;
cin>>n;
int *A = new int[n+1]; //动态数组
A[1] = 1;
for(int i=2;i<n;i++)
{
if(i%2)
A[i] = A[i-1];
else
A[i] = A[i-1] + A[i/2];
}
cout<<"F("<<n<<") = "<<A[n-1]<<endl;
delete[] A;
}