状压解四城最短回路

四个城市两两之间的距离已给。从 0 号出发,每个城市恰好去一次,最后回到 0 号,求最短总路程。补全 tsp:dp[s][u] 表示「走过的城市集合是 s、当前停在 u」时的最短路程。 (本题用 g++ -std=c++17 -O0 编译。

开始练习 →

状压和暴力必须算出同一个数

状压版已给出,补全全排列暴力版 tsp_brute(用 next_permutation)。跑同一组距离,输出三样:状压结果/暴力结果/是否相同(相同输出 结果一致,否则 结果不一致)。 (本题用 g++ -std=c++17 -O0 编译

开始练习 →

从暴力导出 DP 的第一步

第 1 步:结点写的是 i,c 两个参数 第 2 步:每件都分拿、不拿两条路 第 3 步:每件都分拿、不拿两条路 第 4 步:同一组参数出现了两次 第 5 步:记下来:第二次直接查表 0,4 1,4 1,3 2,4 2,3 2,3 2,2

开始练习 →

什么样的递归能导出 DP(C++)

一个递归能改成 DP,前提是【0】。

开始练习 →

暴力和记忆化各调了多少次

十件小物品、容量 8。一边纯暴力递归,一边加上记忆化。运行下面这段程序: #include <algorithm> #include <iostream> #include <string> #inclu

开始练习 →

三种写法算得一样吗

暴力、记忆化、填表三种写法,同一批物品、同一个容量。运行下面这段程序: #include <algorithm> #include <iostream> #include <string> #includ

开始练习 →

第一步先写暴力搜索

补全 go_rec:go_rec(i, c) 表示「从第 i 件开始挑、还剩容量 c」能拿到的最大价值,每件试「不拿」和「拿」两条路。输出「答案/调用次数」。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

第二步把参数当成下标存

补全 go_memo:拿 (i, c) 当 memo 的下标(-1 表示没算过),进函数先查,算完先写。输出「答案/调用次数」。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

第三步把递归换成填表

既然状态就是 (i, c),那就可以不用递归了。补全一维填表版,输出容量 8 的最大价值。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

三种写法省了多少

暴力和填表已给出,补全记忆化。输出三样:暴力调用次数/记忆化调用次数/三个答案是否全相同(相同输出 结果一致,否则 结果不一致)。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →