帮大佬些注释了
//
// main.cpp
// 摆花
//
// Created by 游子墨 on 2024/1/17.
//
#include <iostream>
#define MOD 1000007
#define MAXN 105
using namespace std;
int n, m, a[MAXN], f[MAXN][1005];
int dfs(int i, int cur);
int dfs(int i, int cur) { // 设dfs(i, cur)表示枚举第i种花,已经有了cur盆
if (cur > m) return 0; // 非法情况(现在已有盆数>需要的盆树)
if (cur == m) return 1; // 已经有了m盆花,那么这就是合法方案并且是dfs搜索树的叶子结点,返回1
if (f[i][cur] != -1) { // 记忆化搜索的精髓
return f[i][cur];
}
if (i > n) { // 超出n种花的限制,非法情况
return 0;
}
int ans = 0;
for (int j = 0; j <= a[i]; j++) { // 继续遍历
ans += (ans + dfs(i+1, cur+j)) % MOD;
}
f[i][cur] = ans; // 记忆化搜索的精髓 * 2
return ans; // 返回答案
}
int main(int argc, const char * argv[]) {
// insert code here...
cin >> n >> m; // 输入
for (int i = 1; i <= n; i++) cin >> a[i]; // 输入
memset(f, -1, sizeof(f));// 初始化f数组
cout << dfs(1, 0) << endl;
return 0;
}