数的拆分,算法,动态规划,

数的拆分
一个正整数,可以拆分成若干个正整数的和。例如3可以拆成1+1+1,也可以拆成1+2。对于3,只有这2种拆分方法。
请编写程序,给定正整数n,计算其拆分方案数。
输入格式:
一个正整数n, n <= 5000。
输出格式:
拆分方案数。由于这个数字可能非常大,输出其对1000000007取模。

输入样例:
3
输出样例:
2


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int p(int n, int m)
{
    if (m == 1 || n == 1)
        return  1;
    if (n == m)
        return p(n, m - 1) + 1;
    if (n < m)
        return p(n, n);
    else
        return p(n, m - 1) + p(n - m, m);
}

int main()
{    
    printf("输入整数n:");
    int n;
    scanf("%d",&n);
    printf("有%d种划分方式", p(n, n));
}

参考
https://blog.csdn.net/burse_liu/article/details/122796122

你题目的解答代码如下:

#include <stdio.h>
long long int count(int n, int m)
{
    long long int a = 0;
    if (n <= 1 || m <= 1)
    {
        if (n < 1 || m < 1)
        {
            a = 0;
        }
        else if (n == 1 || m == 1)
        {
            a = 1;
        }
    }

    else
    {
        if (n < m)
        {
            a = count(n, n);
        }
        else
        {
            if (n == m)
            {
                a = count(n, m - 1) + 1;
            }
            else
            {
                a = count(n - m, m) + count(n, m - 1);
            }
        }
    }
    return a;
}

int main()
{
    int n;
    scanf("%d", &n);
    printf("%d\n", count(n, n - 1)%1000000007);
    return 0;
}

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

采纳就对了


class Solution {
public:
    int integerBreak(int n) {
        vector<int> dp(n + 1, 0);
        for(int i = 2; i <= n; i++) {
            int curMax = 0;
            for(int j = 1; j < i; j++) {
                curMax = max(curMax, max(j * (i - j), j * dp[i - j]));
            }
            dp[i] = curMax;
        }
        
        return dp[n];
    }
};