题解:根据题意可以进行递归模拟,此方法最为简便,不过当n大于500时,会造成堆栈溢出或时间复杂度过高等问题。
递归的代码参考如下:

int f(int n){
    if(n == 1) return 1;
    int result = 0;
    for(int i = 1; i <= n/2; ++i)  
        result += f(i);
    return result + 1;  
}

所以考虑递推的做法,先举例来演算,以4为例
可以组成14,24,124,4
可以推得
f[1]=1
f[2]=2=f[1]+1
f[3]=2=f[1]+1
f[4]=4=f[1]+f[2]+1
f[5]=4=f[1]+f[2]+1
以此类推,参考代码如下

long long solve(int n)
{
    // write code here
    long long f[10001] = {0};
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= i / 2; j++)
        {
            f[i] += f[j];
        }
        f[i]++;
    }
    return f[n];
}

不过时间复杂度为n^2
可以在此基础上继续优化,参考代码如下
时间复杂度O(n),空间复杂度O(n)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回最多满足条件的组法
     * @param n int整型 
     * @return long长整型
     */
    long long solve(int n) {
        // write code here
        long long f[10005] = {0};
        long long sum[5005] = {0};

        f[1] = 1;
        for (int i = 2; i <= n; ++i)
        {
            sum[i / 2] = sum[i / 2 - 1] + f[i / 2];
            f[i] = sum[i / 2] + 1;
        }
        return f[n];
    }
};