整数划分






点击查看代码

#include
#include
#include
#include

using namespace std;
const int N = 110;

int dp[N][N];
int f[N][N];
int g[N][N];

int main()
{
    int n, k;
    while(~scanf("%d%d", &n, &k))
    {
        // 问题1.将n划分成若干正整数之和的划分数
        memset(dp, 0, sizeof dp);
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= n; j++)
            {
                if(i < j)   dp[i][j] = dp[i][i];
                else if(i == j) dp[i][j] = 1 + dp[i][j - 1];
                else    dp[i][j] = dp[i - j][j] + dp[i][j - 1];
            }
        }
        printf("%d\n", dp[n][n]);
        
        // 问题2.将n划分成k个正整数之和的划分数
        memset(dp, 0, sizeof dp);
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= n; j++)
            {
                if(i < j)   dp[i][j] = 0;
                else if(i == j) dp[i][j] = 1;
                else    dp[i][j] = dp[i - 1][j - 1] + dp[i - j][j];
            }
        }
        printf("%d\n", dp[n][k]);
        
        // 问题3.将n划分成最大数不超过k的划分数
        memset(dp, 0, sizeof dp);
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= n; j++)
            {
                if(i < j)   dp[i][j] = dp[i][i];
                else if(i == j) dp[i][j] = 1 + dp[i][j - 1];
                else    dp[i][j] = dp[i - j][j] + dp[i][j - 1];
            }
        }
        printf("%d\n", dp[n][k]);
        
        // 问题4.将n划分成若干个奇正整数之和的划分数
        memset(f, 0, sizeof f);
        memset(g, 0, sizeof g);
        f[0][0] = 1, g[0][0] = 1;
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= n; j++)
            {
                g[i][j] = f[i - j][j];
                f[i][j] = f[i - 1][j - 1] + g[i - j][j];
            }
        }
        int ans = 0;
        for(int i = 0; i <= n; i++) ans += f[n][i];
        printf("%d\n", ans);
        
        // 问题5.将 n 划分成若干不同整数之和的划分数
        memset(dp, 0, sizeof dp);
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= n; j++)
            {
                if(i < j)   dp[i][j] = dp[i][i];
                else if(i == j) dp[i][j] = 1 + dp[i][j - 1];
                else    dp[i][j] = dp[i - j][j - 1] + dp[i][j - 1];
            }
        }
        printf("%d\n\n", dp[n][n]);
    }
    
    return 0;
}