wikioi-1039-数的划分

将整数n分成k份,且每份不能为空,任意两种划分方案不能相同(不考虑顺序)。

dp[i][j]:把数i分成k分的方案数

则:dp[i][j]=sum(dp[i-j][t])(t>=1&&t<=j)

#include <iostream>
#include<stdio.h>
#include<cstring>
#include <algorithm>
using namespace std;
int dp[501][21];
int main()
{
    int n,k,i,j,t;
    while(~scanf("%d %d",&n,&k))
    {
        memset(dp,0,sizeof(dp));
        for(i=0;i<21;i++)dp[i][i]=1;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=k&&j<i;j++)
            {
                for(t=1;t<=j;t++)
                {
                    if((i-j)>=t)dp[i][j]+=dp[i-j][t];
                }
            }
        }
        cout<<dp[n][k]<<endl;
    }
    return 0;
}


原文地址:https://www.cnblogs.com/suncoolcat/p/3331148.html