zoukankan      html  css  js  c++  java
  • codevs 1039:数的划分

    http://codevs.cn/problem/1039/

    题目描述 Description
    将整数n分成k份,且每份不能为空,任意两种划分方案不能相同(不考虑顺序)。
    例如:n=7,k=3,下面三种划分方案被认为是相同的。
    1 1 5

    1 5 1

    5 1 1
    问有多少种不同的分法。

    输入描述 Input Description
    输入:n,k (6<n<=200,2<=k<=6)

    输出描述 Output Description

    输出:一个整数,即不同的分法。

    样例输入 Sample Input
    7 3

    样例输出 Sample Output
    4

    数据范围及提示 Data Size & Hint
    {四种分法为:1,1,5;1,2,4;1,3,3;2,2,3;}

    芒果君:学DP也有一阵子了,然而这个简单的划分型DP还是不太会写,主要是没有思路OTZ……这道题学递归的时候写过,然而用DP的话就很茫然,看完题解,我的理解是酱紫的,首先这个状态转移方程分为两部分,第一部分:F[i-j][j],就是现在k个位置上铺一层"1",然后再把i-j个数分成j份的方案“搭”在上面,这样就涵盖了所有“每一位都不为1”的方案,剩下的就是第二部分:F[i-1][j-1],意思是先把"1"放在第1位上,剩下i-1个数分成j份。需要注意的是,你在一开始要初始化i个数分成1份,方案数是1,还要照顾到F[1][1],所以把F[0][0]置成1。哦对了!i>=j的时候才是有意义的。

    #include<cstdio>
    using namespace std;
    int f[210][8],n,k,i,j;
    int main()
    {
        scanf("%d%d",&n,&k);
        f[0][0]=1;
        for(i=1;i<=n;++i)
        {
            f[i][1]=1;    
        }
        for(i=1;i<=n;++i)
        {
            for(j=1;j<=k;++j)
            {
                 if(i>=j)
                 {
                     f[i][j]=f[i-j][j]+f[i-1][j-1]; 
                 }
            }
        }
        printf("%d",f[n][k]);
        return 0;
    }
  • 相关阅读:
    windows环境下面批量修改文件夹名称
    项目中的坑(二)
    微信公众号支付之退款
    微信公众号支付之付款
    excel两张表数据匹配数据(VLOOKUP)
    windows环境下面批量移动文件到指定文件夹里面
    windows环境下面批量新建文件夹
    linux 完全卸载软件方法
    如何获取应用宝APP ID
    mysql 时间函数转换
  • 原文地址:https://www.cnblogs.com/12mango/p/6803567.html
Copyright © 2011-2022 走看看