以下是代码(忘记贴了emmm)
```cpp
#include<bits/stdc++.h>
using namespace std;
int n,m,ans,cnt;
int a[1100],b[1100][1100];
int dfs(int rest/*还需要摆多少盆花*/,int i/*x*/){
if(rest==0)
return 1;
if(i==n+1) return 0;
if(rest<0) return 0;
for(int j=0;j<=a[i];j++){
if(!b[rest-j][i+1]) b[rest-j][i+1]=dfs(rest-j,i+1);
ans+=b[rest-j][i+1];
}
return 0;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
dfs(m,1);
cout<<ans<<endl;
}
by _yKy @ 2019-06-17 14:48:12
@[1842932279abc](/space/show?uid=214545) 这样写的话会出现负下标吧
```cpp
if(!b[rest-j][i+1]) b[rest-j][i+1]=dfs(rest-j,i+1);
```
万一rest-j<0呢
by Sweetness @ 2019-06-17 16:22:09
#include<bits/stdc++.h>
using namespace std;
int n,m,i,j,z;
int a[1000000],f[10000][10000];
int main()
{
cin>>n>>m;
f[0][0]=1;
for(i=1;i<=n;i++)
{
cin>>a[i];
}
for(i=1;i<=n;i++)
{
for(j=0;j<=m;j++)
{
for(z=0;z<=min(a[i],j);z++)
{
f[i][j]=(f[i][j]+f[i-1][j-z])%1000007;
}
}
}
cout<<f[n][m];
return 0;
}
by 谢家林2bzllx @ 2019-06-17 20:49:50