题意
给出NNN种花,其中第iii种花的数量不能超过aia_iai个,求一共摆MMM个花的方案数模1000007。
思路
动态规划。设f[i][j]f[i][j]f[i][j]为前iii种花摆jjj个的方案数,可得动态转移方程:
f[i][j]+=f[i][j−k]{k<=a[i]}f[i][j]+=f[i][j-k]\{k<=a[i]\}f[i][j]+=f[i][j−k]{k<=a[i]}
代码
#include<cstdio>
int N, M;
int a[1001], f[1001][1001];
int main() {
scanf("%d %d", &N, &M);
for (int i = 1; i <= N; i++) scanf("%d", &a[i]);
f[0][0] = 1;
for (int i = 1; i <= N; i++)
for (int j = 0; j <= M; j++)
for (int k = 0; k <= a[i]; k++)
f[i][j] = (f[i][j] + f[i - 1][j - k]) % 1000007;
printf("%d", f[N][M]);
}