蒟蒻太若,刚学 OI,写前缀和优化 dp,WA 了两个点。
题意
有 n 个不同的小朋友和 k 个相同的糖,给每个小朋友分配若干个糖且糖要分配完,每个小朋友分配糖的上限个数为 ai,求分配方案总数。
code
#include <bits/stdc++.h>
using namespace std;
const int N= 1e5+ 5, mod= 1e9+ 7;
long long n, p[105], dp[105][N], k, sum[105][N];
signed main()
{
scanf("%d%d", &n, &k);
for(int i= 1; i<= n; i++) scanf("%d", &p[i]);
for(int i= 1; i<= p[1]+ 1; i++) dp[1][i]= 1;
for(int i= 1; i<= k+ 1; i++) sum[1][i]= (sum[1][i- 1]+ dp[1][i])% mod;
for(int i= 2; i<= n; i++)
for(int j= 1; j<= k+ 1; j++)
dp[i][j]= ((long long)sum[i- 1][j]- ((j> p[i]+ 1) ? sum[i- 1][j- p[i]- 1] : 0))% mod,
sum[i][j]= ((long long)sum[i][j- 1]+ dp[i][j])% mod;
printf("%lld", dp[n][k+ 1]% mod);
return 0;
}