UVA 10943 - How do you add

来源:互联网 发布:闪凌网络是真的吗 编辑:程序博客网 时间:2024/05/16 05:53

这道题就是把一个数n分成k个数的和,要求出最多能有多少种可能,要注意一点,k个数都是非负的,由于数据较大,要求最后结果mod1000000后输出,其实这道题经分析不难看出也是有规律的一道题,

DP[k][n] = sum{DP[k-1][i]} (0<=i<=n)

所以只需要做一下预处理,把所有需要的数存在一个100*100的数组里,然后根据输入的k,n输出对应的DP[k][n]就行了;

#include<cstdio>
#include<cstring>
int DP[101][101];
int main()
{
    int i,j;
    memset(DP,0,sizeof(DP));
    for(i=0;i<101;i++)
        DP[i][0]=1;
    for(i=1;i<101;i++)
    {
        for(j=1;j<101;j++)
        {
            for(int k=0;k<=j;k++)
            {
                DP[i][j]+=DP[i-1][k];
                DP[i][j]%=1000000;
            }
        }
    }
    int n,k;
    while(scanf(\"%d%d\",&n,&k)!=EOF,(n||k))
        printf(\"%d\\n\",DP[k][n]);
    return 0;
}

原创粉丝点击