🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
https://oi-wiki.org/dp/memo/ 开个数组`mem`, 记录下来每个`dfs(pos,tleft)`的返回值。刚开始把`mem`中每个值都设成`-1`(代表没访问过)。每次刚刚进入一个 dfs 前(我们的 dfs 是递归调用的嘛),都判断`mem[pos][tleft]`是否为`-1`, 如果是就正常执行并把答案记录到`mem`中,否则? **直接返回 mem 中的值!** ``` // // main.cpp // Algorithm21dynamicProgram0801 // // Created by terry on 2021/9/3. // #include **using** **namespace** std; // C++ Version **int** n, t; **int** tcost\[103\], mget\[103\]; **int** mem\[103\]\[1003\]; **int** dfs(**int** pos, **int** tleft) { **if** (mem\[pos\]\[tleft\] != -1) **return** mem\[pos\]\[tleft\]; **if** (pos == n + 1) **return** mem\[pos\]\[tleft\] = 0; **int** dfs1, dfs2 = -1;//-INF; dfs1 = dfs(pos + 1, tleft); **if** (tleft >= tcost\[pos\]) dfs2 = dfs(pos + 1, tleft - tcost\[pos\]) + mget\[pos\]; **return** mem\[pos\]\[tleft\] = max(dfs1, dfs2); } **int** main() { memset(mem, -1, **sizeof**(mem)); cout<<"\[t:"; cin >> t >> n; **for** (**int** i = 1; i <= n; i++) {//for110 cout<<"\[i("<<i<<":"; cin >> tcost\[i\] >> mget\[i\]; cout<<endl; }//for110 cout<<std::endl<<"{Dfs:"; cout << dfs(1, t) << endl; **return** 0; } ```