YBTOJ:数的划分

题目大意

  把整数n分成k份,每份都不能为空,任意两种方案都不相同(不考虑顺序,即1、1、5;1、5、1;5、1、1这三种方案是相同的)。求把整数n分为k份的方案数

题目分析

  设f(i,j)表示把i分为k份时的方案数:

  明显看出,当i<j时,f(i,j)==0;

  当i==j时,也只有每份都为1一种分法,所以f(i,j)==1;

  当i>j时,有两种情况:

  1、j份中有至少一份为1,则方案数与将整数i-1分为j-1份时是一样的,所以有1的情况的方案数==f(i-1,j-1)

  2、j份中没有1时,则将j份每一份都减去1,所以方案数为f(i-j,j);

  综上,f(i,j)==f(i-1,j-1)+f(i-j,j);

Code

#include<iostream>
#include<cstdio>
#define sco 100
using namespace std;
int n,m,f[sco][sco];
int main(){
    scanf("%d%d",&n,&m);f[1][0]=1;
    for(int i=1;i<=m;++i)
        for(int j=1;j<=n;++j){
            if(j==1)f[j][i]=f[j+1][i-1]+f[n][i-1];
            else if(j==n) f[j][i]=f[1][i-1]+f[j-1][i-1];
            else f[j][i]=f[j+1][i-1]+f[j-1][i-1];
        }
    printf("%d",f[1][m]);
    return 0;
}

YBTOJ:数的划分

上一篇:单细胞分析实录(17): 非负矩阵分解(NMF)代码演示


下一篇:关于Date的使用