您的位置:首页 > 其它

2013武科大蓝桥杯校内选拔赛 I题 划分数

2013-11-15 23:47 190 查看
题目链接:点击打开链接

三维的dp方程比较好理解。。。

假设dp[i][j][k]表示数i划分成k份,最大的那份不大于j的总数

那么转移方程是

dp[i][j][k] = dp[i][j-1][k] + dp[i-j][j][k-1]

然后边界处理,我写错了。在别人的帮助下才改对。

#include<cstdio>
#include<cstring>
using namespace std;
 
int dp[220][220][10];
 
int solve(int m,int i,int k)
{
    if(k==0&&m==0)
        return 1;
    if(m<=0||k==0||i==0)
        return 0;
    else if(dp[m][i][k] != -1) {
        return dp[m][i][k];
    }else if(m<i)
        return dp[m][i][k] = solve(m, m, k);
    else
        return dp[m][i][k] = solve(m, i-1,k)+solve(m-i, i, k-1);
 
}
 
void init()
{
    memset(dp, -1, sizeof(dp));
    for(int i=1;i<=200;i++)
    {
        for(int j=1;j<=200;j++)
        {
            for(int k=1;k<=6;k++)
            {
                solve(i,j,k);
            }
        }
    }
}
 
 
int main()
{
    int n,m;
    init();
 
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        printf("%d\n",dp

[m]);
    }
    return 0;
}


官方题解~

第9题:划分数

本题为动态规划题。

dp[i][j]表示数i划分成j份的总数。

转移方程:dp[i][j]=dp[i-1][j-1]+dp[i-j][j];(i>=j)

分类讨论,分成两类:

1、最小的那一份为1,则为dp[i-1][j-1],表示将剩下的i-1分成j-1份。

2、最小的那一份大于1,即>=2,先把j份每个里面放1,然后在把剩下的i-j分成j份。

(可以想象i个苹果放进j个盒子里)

#include<cstdio>
#include<iostream>
using namespace std;

int p[220][10];

void init()
{
    p[0][0]=1;

    for(int i=1;i<=200;i++)
    {
        for(int j=1;j<=6;j++)
        {
            if(i>=j)
                p[i][j]=p[i-1][j-1]+p[i-j][j];
        }
    }
}

int main()
{
    int n,m;
    init();

    while(~scanf("%d%d",&n,&m))
    {
        printf("%d\n",p
[m]);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: