/*
各物品个数有限且不一定相同的背包问题
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int mod=1e6+7;
int a[1005];
int dp[1005][1005];//dp[i][j]前i个数,容量为j的种数
signed main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
dp[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++){
for(int k=0;k<=min(j,a[i]);k++){
dp[i][j]=(dp[i][j]+dp[i-1][j-k])%mod;
// cout<<"dp["<<i<<"]"<<"["<<j<<"]"<<"="<<dp[i][j]<<endl;
}
}
}
cout<<dp[n][m]<<endl;
}
一个dp转移视角,可供理解。对于特殊的j=0程序输出为1,若题目输入范围包含零,则要加特殊情况。