把 A 归到 B 是在做什么
第 1 步:一个都不挑:和为 0 第 2 步:加入 1 以后能凑出这些 第 3 步:加入 2 以后能凑出这些 第 4 步:加入 4 以后能凑出这些 第 5 步:总和一半凑得出就能平分 0 1 2 3 4 5 6 7 「把问题 A 归约到问题
归约的方向能不能反过来
已知 B 有快算法,你把 A 归约到 B,于是 A 也能快速解。要是方向反过来(把 B 归约到 A),得到的结论是【0】。
三个数组各能否分两半
「划分问题」:能不能把一个数组分成两堆,两堆的和相等?三个数组各判一次。注意 can_split 一行新算法都没写,只是把输入交给了 subset_sum: #include <algorithm> #include <i
把划分归约到子集和
subset_sum 已经有了。把「划分问题」翻译过去——一行新算法都不许写。 (本题用 g++ -std=c++17 -O0 编译。)
有些情况根本不用跑
三个数组各判一次,数一数 subset_sum 真正被调用了几次,输出如 2/3。(和是奇数的那个,一眼就能否掉,不该占一次调用。) (本题用 g++ -std=c++17 -O0 编译。)
归约做成了没有
一次归约算不算做成,验三件事:答案对、没写新算法(can_split 的源码里没有 for)、两者同时成立。输出如 过/过/过。 (本题用 g++ -std=c++17 -O0 编译。)
一个解法三个问题
数组 {10, 20, 15, 5}(总和 50)。三个看起来不一样的问题:能不能平分、能不能分成相差 10 的两堆、有没有子集和正好是 7。三个都归约到同一个 subset_sum。输出如 能/能/不能。 (本题用 g++ -std=c+
设计加证明该包含什么
第 1 步:一份交付要四类依据 第 2 步:先对拍:快速证伪 第 3 步:再验:每轮都成立 第 4 步:出循环能推出结论 第 5 步:最后数操作次数 第 6 步:四条都有,才算交付 对拍 不变式 终止 复杂度 ✓ ✓ ✓ ✓ 交付一个自己设
对拍在这套办法里排第几
学完这条路线,再看「和另一种写法对拍」这件事,它的位置是【0】。
这条路线上的四个数
把前面几节算出来的四个关键数字汇总输出:判素数的第一个反例、归并漏一句时放过它的输入数、比较排序的下界、十六次 push_back 的总搬移。 #include <algorithm> #include <iostream