整数拆分

将一个整数拆分成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 = 2 + 2

4 = 1 + 1 + 2

4 = 1 + 1 + 1 + 1 奇数情况: f(2n+1) = f(2n)

故只需要算偶数

核心思想在于,想到相邻两个偶数有关系,或者利用已知结果推导进行推导,

已经想到的有,将拆分分成两种情况讨论,即拆分多项式里边有1和没1的情况。

有1的项,必至少有两个1:比如10 = 8 + 1 + 1 故这里只需要等于8的数量。

无1的项,最小的项是2,所以整个项必可以除2,

所以 10 = 5 * 2 这里只需要算等于5的数量。

所以当 f(2n+1) = f(2n)

而f(2n)= f(2n-2) +f(n),利用递推可以很轻松算出结果即:

int f(int i)
{
    if(i%2) return f(i-1);
    if (i == 1) return 1;
    else
    {
        return f(i-2) + f(i/2);
    }
}

此时,函数复杂度为 O(2^n)

f可以优化成非递归的形式,即利用空间数组:

int n[MAX];
n[1] = 1;
for(int i=2; i<MAX; i++)
{
    if(i%2) return n[i] = n[i-1];
    else
    {
        n[i] = n[i-2] + n[i/2];
    }
}
Comments