设状态函数f(i,j)为前i中花放在j个位置的方案数
选择k个第i种花放,则f(i,j)=f(i-1,j-k){k>=0,k<=a[i],k<=j}
填表法:
void task()
{
for(int i=0;i<=n;i++) d[i][0]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=0;k<=a[i]&&k<=j;k++)
d[i][j]=(d[i][j]+d[i-1][j-k])%mod;
cout<<d[n][m];
}
记忆化
long long f(long long x,long long y)
{
if(y==0) return 1;
if(x==0) return 0;
if(d[x][y]>=0) return d[x][y];
long long ans=0;
for(int k=0;k<=a[x]&&k<=y;k++) ans=(ans+f(x-1,y-k))%mod;
d[x][y]=ans;
return ans%mod;
}
void task2()
{
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++) d[i][j]=-1;
cout<<f(n,m);
}