60pts代码
#include<bits/stdc++.h>
using namespace std;
int m,n;
int mod=1e6+7;
int a[105];
int f[105][105];
int dfs(int x,int sum)
{
if(f[x][sum]) return f[x][sum];
if(sum>m) return 0;
if(sum==m) return 1;
if(x==n+1) return 0;
int ans=0;
for(int i=0;i<=a[x];i++)
{
ans+=dfs(x+1,sum+i);
ans=ans%mod;
}
f[x][sum]=ans;
return ans;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
cout<<dfs(1,0);
}
为什么把dfs里面的第一个判断条件if(f[x][sum]) return f[x][sum];移成最后的判断条件就行了?越界的情况应该不会被记录吧……