LightOJ 1191 Bar Codes(数位统计)

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1191

题意:将n分成k个数的和每个数x满足1<=x<=m。比如n=7,k=4,m=3,7=1+3+1+2和7=1+2+1+3是不同的。求有多少种分法。

思路:f[n][k][m]=sigama(f[n-i][k-1][m])(1<=i<=m)

#include <iostream>

#include <cstdio>

#define i64 long long

using namespace std;





int C,num=0;

int n,m,K;

i64 f[55][55][55];



void init()

{

    int i,j,k,t;

    for(k=1;k<=50;k++)

    {

        for(i=1;i<=k;i++) f[i][1][k]=1;

        for(i=2;i<=50;i++) for(j=i;j<=50;j++)  for(t=1;t<=k&&t<=j;t++)

            f[j][i][k]+=f[j-t][i-1][k];

    }

}



int main()

{

    init();

    for(scanf("%d",&C);C--;)

    {

        scanf("%d%d%d",&n,&K,&m);

        printf("Case %d: %lld\n",++num,f[n][K][m]);

    }

    return 0;

}

  

你可能感兴趣的:(code)