设计好用的网站,wordpress仿模板,wp网站做企业站好不好,初次创业开什么店合适曾经我们讲过枚举算法#xff0c;那假设我们把枚举算法应用到搜索里呢#xff1f; 1.搜索枚举
以前我们在进行枚举的时候是用了多层循环嵌套#xff0c;但是当枚举的变量过多或者是输入的数量的时候就很难利用循环完成枚举了#xff0c;不过我们可以尝试利用搜索进行枚举。…
曾经我们讲过枚举算法那假设我们把枚举算法应用到搜索里呢 1.搜索枚举
以前我们在进行枚举的时候是用了多层循环嵌套但是当枚举的变量过多或者是输入的数量的时候就很难利用循环完成枚举了不过我们可以尝试利用搜索进行枚举。
通常我们通过一个 dfs 函数来完成搜索枚举而通过参数表示当前状态。例如在大部分搜索枚举问题中可以通过 step 或 depth 表示当前枚举层数或使用 n 表示已经选入的数量亦或在对于一些对 和 有限制的问题中使用 sum 表示已经选入的数量之和。 让我们看一道能够使用搜索枚举实现的题目现有方程a[1]x[1]a[2]x[2]a[3]x[3]...a[n]x[n]0 2≤n≤10,−5≤a[i]≤5,−2≤x[i]≤2,x[i]∈Z
求解的总数。 Z 表示整数集合其包括了全体正整数、全体负整数和零。 能够估算所有的状态总数在 10的5次方∼10的7次方能够枚举全部的状态。虽然能够使用 10 个循环完成但此处使用搜索枚举更为方便。 int ans 0;
void dfs(int dep, int sum) {if (dep n) {if (sum 0){ans;}return;}for (int i -2; i 2; i) {dfs(dep 1, sum a[dep] * i);}
} 在很多搜索枚举的问题中会要求我们打印解的具体内容那么可使用数组来保存具体的解。如对于之前求方程解的问题可将代码修改为
int ans[15];
void dfs(int dep, int sum) {if (dep n) {if (sum 0){for (int i 0; i n; i) {cout ans[i] ;}cout endl;}return ;}for (int i -2; i 2; i) {ans[dep] i;dfs(dep 1, sum a[dep] * i);}
}
把在dep这一层选择的情况放在ans[dep]位置ans数组就记下了目前枚举到的情况。n 在搜索枚举的过程中我们能够根据题目的一些性质对求解的过程进行剪枝优化这个我们以后也会学到。但是对大部分题目来说搜索枚举很有可能达到状态的上限所以很有必要在决定使用搜索枚举之前确定状态的总数。