题目链接
TLE做法
#include <iostream>
using namespace std;
const int N = 100010,mod=1e9+7;
int f[N];//前i个人且共分了j个蛋糕
int a[110];
int n,m;
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
f[0]=1;
for(int i=1;i<=n;i++)
{
for(int j=m;j>=0;j--)
{
for(int k=1;k<=a[i];k++)
{
if(j>=k)f[j]+=f[j-k];
}
}
}
cout<<f[m]<<endl;
}
前缀和优化AC做法
#include <iostream>
using namespace std;
const int N = 110,M=100010,mod=1e9+7;
int f[N][M];//前i个人且共分了j个蛋糕
int sum[N][M];//f的前缀和
int a[N];
int n,m;
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
f[1][0]=sum[1][0]=1;
for(int i=1;i<=m;i++)f[1][i]=(i<=a[1]),sum[1][i]=f[1][i]+sum[1][i-1];
for(int i=2;i<=n;i++)
{
f[i][0]=sum[i][0]=1;
for(int j=1;j<=m;j++)
{
if(j<=a[i])f[i][j]=sum[i-1][j]%mod;
else f[i][j]=(sum[i-1][j]-sum[i-1][j-a[i]-1]+mod)%mod;
sum[i][j]=(sum[i][j-1]+f[i][j])%mod;
}
}
cout<<f[n][m]<<endl;
}