题目大意
有 n n n 种花,第 i i i 种有一样的 a i a_i ai 盆。从这些花里选出 m m m 盆,按照种类顺序排列。求方案数。
解题思路
不难想到动态规划。设 f i , j f_{i,j} fi,j 表示从前 i i i 种花中选取 j j j 盆的方案数,不难得到状态转移方程 f i , j = ∑ k = 1 a i f i − 1 , j − k f_{i,j}=\sum_{k=1}^{a_i}{f_{i-1,j-k}} fi,j=k=1∑aifi−1,j−k
注意转移顺序、边界等细节。
#include <cstdio>
#include <cstdlib>
#include <cstring>
const int MAXN=110;
const int MOD=1e6+7;
int n, m;
int a[MAXN];
int f[MAXN][MAXN];
//f[i][j]表示使用前i种花摆前j格的方案数
int main (){
scanf ("%d%d", &n, &m);
for (int i=1; i<=n; ++i)
scanf ("%d", &a[i]);
memset (f, 0, sizeof (f)); f[0][0]=1;
for (int i=1; i<=n; ++i)
for (int j=0; j<=m; ++j)
for (int l=0; l<=a[i]; ++l)
if (j>=l)
f[i][j]=(f[i][j]+f[i-1][j-l])%MOD;
// for (int i=1; i<=n; ++i){
// for (int j=1; j<=m; ++j)
// printf ("%d ", f[i][j]);
// puts ("");
// }
printf ("%d", f[n][m]);
}