记搜0分求救
查看原帖
记搜0分求救
1013950
__youzimo2014__楼主2024/1/17 21:15

帮大佬些注释了

//
//  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;
}
2024/1/17 21:15
加载中...