SDNUOJ1029巧分整数

SDNUOJ1029巧分整数

Description

聪明的lg给syc出了一道简单的题目,syc把脑细胞都用光了也不知道该怎么去做,那么请厉害的你来帮助syc做做这道题目。题目的要求就是取一个整数n,这个整数n大于0小于等于200,然后把这个整数n分为k份,并且每一份不能为0,而且任意两种分法不能相同(不考虑顺序)。

例如:n=8,k=3, 下面三种分法被认为是相同的。
2,2,4;  4,2,2;  2,4,2;

问有多少种不同的分法。

Input

n,k (k<=n<=200,1<=k<=6)

Output

一个整数,即不同的分法。
题意:就是给两个数n和k,问把n分成k份有几种
思路:
把任何一个数分解都有有1的情况和没有1的情况
然后比如把8分3份
就有1,1,6和加上把(8-3)分三份再把分的每一份加上1
dp
AC代码

#include
int main()
{
    int n, k;
    int dp[210][10] = {0};
    for(int i = 1; i <= 200; i++)
    {
        dp[i][1] = 1;
    }
    for(int i = 2; i <= 6; i++)
    {
        dp[i][i] = 1;
        dp[1][i] = 0;
    }
    for(int i = 1; i <= 200; i++)
    {
        for(int j = 1; j <= 6; j++)
        {
            if((i > j) && (i-1) && (j-1))
                dp[i][j] = dp[i-1][j-1] + dp[i-j][j];
            //printf("%d ", dp[i][j]);
        }
       //printf("\n");
    }

    while(scanf("%d %d", &n, &k) != EOF)
    {
        printf("%d\n", dp[n][k]);
    }
    return 0;
}

还可以写成函数递归的形式

#include
#include
using namespace std;
int f(int n, int k)
{
    if(n == k || k == 1)
        return 1;
    if(n < k)
        return 0;
    return f(n - 1, k - 1) + f(n - k, k);
}
int main()
{
    int n, k;
    while(~scanf("%d %d", &n, &k))
    {
        cout<return 0;
}

你可能感兴趣的:(SDNUOJ1029巧分整数)