先写不剪枝的版本

补全 naive_dfs:把 1 到 n 全排满,排满之后再检查有没有连号挨着。st.v 记走过的结点数。把解的个数和结点数拼起来输出(n = 5)。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

再写剪枝的版本

补全 pruned_dfs:放上去之前就检查——和 path 最后一个相差 1 就跳过,不往下走。把解的个数和结点数拼起来输出(n = 5)。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

省了多少且解必须一样

把两个版本都写出来,输出三样:不剪枝的结点数、剪枝的结点数、两者解的个数是否相同(相同输出 结果一致,否则 结果不一致)。三样用 / 拼起来。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

子集问题的规模(C++)

n 个不同元素的子集一共有【0】个。

开始练习 →

有重复元素时怎么去重

第 1 步:排好序:1 2 2 第 2 步:这一层先挑第一个 2 第 3 步:同层再挑 2:和前一个一样 第 4 步:跳过它,免得重复 第 5 步:但往下一层挑它可以 1 2 2 i 元素里有重复时,避免生成重复子集的办法是【0】。

开始练习 →

组合类问题每层的起点(C++)

生成组合时,下一层递归的起点应该是【0】。

开始练习 →

有重复元素去重前后差多少

1、2、2 里有两个一样的 2。一边不去重、一边去重,各生成一遍全部子集。运行下面这段程序: #include <cstdlib> #include <iostream> #include <string>

开始练习 →

写一个子集

补全 subs_dfs:生成 1、2、3 的全部子集。注意子集要在每一层都记一次,不是只在最底下记。输出子集的个数。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

写一个去重的子集

补全 subsu_dfs:同一层跳过和前一个相同的元素(数组已经排好序)。对 1、2、2 输出子集个数。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

选出和为目标的搜索

补全 pick_dfs:从 1、2、3、4 里选若干个(每个最多选一次),和正好等于 5。顺手剪一刀:和已经超过目标就别往下走了。输出有几种选法。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →