题意:有N个相同的球,M个不同的盒子,每个盒子最多放K个球。请计算将这N个球全部放入盒子中的方案数模1000007后的结果。
解法:f[i][j]表示i个盒子里放j个球的方案数。
1.得到3重循环的坐法,枚举第i个盒子里放k个球——f[i][j]=sum( f[i-1][j-k~j] )
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 using namespace std; 6 #define N 5010 7 #define Mod 1000007 8 9 int f[2][N]; 10 11 int mmin(int x,int y) {return x<y?x:y;} 12 int main() 13 { 14 int n,m,kk; 15 scanf("%d%d%d",&n,&m,&kk); 16 f[0][0]=1; 17 int u=1; 18 for (int i=1;i<=m;i++) 19 { 20 for (int j=1;j<=n;j++) 21 { 22 f[u][j]=0; 23 for (int k=1;k<=mmin(j,kk);k++) 24 f[u][j]=(f[u][j]+f[1-u][j-k])%Mod; 25 } 26 u=1-u; 27 } 28 printf("%d\n",f[1-u][n]); 29 return 0; 30 }