换一张图比值顶到 2
换一张图:三条互不相连的边。贪心和最优各要几个点? #include <algorithm> #include <iostream> #include <string> #include <vect
写出 2-近似的顶点覆盖
补全贪心:挨条边看,两头都没被盖住就把两头一起收下。输出「贪心个数/最优个数」。 (本题用 g++ -std=c++17 -O0 编译。)
两张图的近似比
两张图各算一次近似比,用整数表示(放大 100 倍),再验一次两者都没超过 2 倍。输出如 150/200/都没超。 (本题用 g++ -std=c++17 -O0 编译。)
最优要试多少个子集
暴力求最优要一个个试子集。数一数它试了多少个、贪心只看了多少条边,再算出七个点一共有多少个子集。 (本题用 g++ -std=c++17 -O0 编译。)
把 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 编译。)