dp
#include <iostream>
using namespace std;
const int N = 1010, mod=1e6+7;
int n, m, a[N], f[N][N]; //用了前i种花,共放了j盆
int main() {
cin >> n >> m;
for (int i=1; i<=n; i++) cin >> a[i];
for (int i=0; i<=n; i++) f[i][0]=1; //如果用此初始化,j应从1开始,否则重复计算
//f[0][0]=1; //用此初始化,j从0开始
for (int i=1; i<=n; i++) {
for (int j=1; j<=m; j++) {
for (int k=0; k <= min(j,a[i]); k++) {
f[i][j] =(f[i][j] + f[i-1][j-k]) % mod;
}
}
}
cout << f[n][m] <<endl;
return 0;
}
,滚动数组降维
#include <iostream>
using namespace std;
const int N = 1010, mod=1e6+7;
int n, m, a[N], f[N];
int 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; j--) {
for (int k=1; k <= min(j,a[i]); k++) { //k=1,因为不用加上f[i-1][j]
(f[j] += f[j-k])%=mod;
}
}
}
cout << f[m] <<endl;
return 0;
}