题目大意
要从 $n$ 种花中挑出 $m$ 盆展览,其中第 $i$ 种花不得多于 $a_i$ 种。求有几种选法。
分析
考虑动态规划,记状态 $dp[i,j]$ 为摆完前 $i$ 种花,共 $j$ 盆时的方案数。容易得到递推式
$$ dp[i,j] = \sum_{k = j - \min(a_i, j)}^j dp[i-1,k] $$
边界条件是 $dp[0,0] = 1$。可以用滚动数组、前缀和优化。
const ll mod = 1e6 + 7;
ll dp[110], aa[110], sum[110];
int main() {
ll n = rr(), m = rr();
sum[0] = dp[0] = 1;
for (ll i = 1; i <= n; i++)
aa[i] = rr();
for (ll i = 1; i <= n; i++) {
for (ll j = 1; j <= m; j++)
sum[j] = (sum[j - 1] + dp[j]) % mod;
for (ll j = m; j >= 0; j--) {
int t = j - 1 - min(aa[i], j);
if (t > 0)
dp[j] = (dp[j] + sum[j - 1] - sum[t]) % mod;
}
}
printf("%lld\n", (dp[m] + mod) % mod);
return 0;
}