假设现在有一列数a[0],a[1], ...a[n-1]
①如果一个问题的解的长度不是固定的,并且解和元素顺序无关,即可以从中选择0个或多个,那么解空间的个数将是指数级别的,为2^n,可以用下面的子集树来表示所有的解(假设这里n=4)
PIC. 子集树
子集树的算法框架为
void backtrack(int t) {//表示访问到第t层,t从0开始
if (t == n) //如上图(PIC. 子集树)n = 4的时候就可以输出解了
output(x);
else
for (int i = 0; i <= l; i++) { //表示选或不选a[t]
x[t] = i;
if (constraint(t) && bound(t))
backtrack(t + 1);
}
}
②如果解空间是由n个元素的排列形成,也就是说n个元素的每一个排列都是解空间中的一个元素,那么,最后解空间的组织形式是排列树
PIC.排列树
排列树算法的基本框架为
模板一