回溯之子集树和排列树(子集和问题)

一、子集树
          子集树:当所给的问题是从n个元素的集合S中找出满足某种性质的子集时,相应的解空间称为子集树。例如,那个物品的0-1背包问题所相应的解空间树就是一颗子集树。这类子集问题通常有2^n个叶节点,其节点总个数为2^(n+1)-1。遍历子集树的任何算法均需要O(2^n)的计算时间。

\

void backtrack (int t)
{
    if (t>n) output(x);
    else
        for (int i=0;i<=1;i++) {
            x[t]=i;
            if (legal(t)) backtrack(t+1);
        }
}

二、排列树
        排列树:当所给问题是确定n个元素满足某种性质的排列时,相应的解空间树称为排列树。排列树通常有n!个叶子节点。因此遍历排列树需要O(n!)的计算时间。
     

void backtrack (int t)
{
    if (t>n) output(x);
    else
        for (int i=t;i<=n;i++) {
            swap(x[t], x[i]);
            if (legal(t)) backtrack(t+1);
            swap(x[t], x[i]);
        }
} 

更多:http://blog.csdn.net/liufeng_king/article/details/8762073

子集和问题:

题目描述:子集和问题的一个实例为〈S,t〉。其中,S={ 1 x , 2 x ,…, n x }是一个正整数的集合,c是一个正整数。子集和问题判定是否存在S的一个子集S1,使得s1中的各元素之和等于c。

http://blog.sina.com.cn/s/blog_7865b083010100dd.html

http://blog.csdn.net/sjf0115/article/details/6996804

http://blog.csdn.net/neilhappy/article/details/7313608

时间: 2024-10-30 16:35:04

回溯之子集树和排列树(子集和问题)的相关文章

两种典型的解空间树:子集树和排列树

(1)定义 子集树:所给问题是从N个元素的集合中找出满足某种性质的子集时,相应的解空间树,称为子集树.子集树通常有2^n个叶节点,遍历子集树的任何算法都需要O(2^n)的计算时间. 例如:0-1背包问题的解空间树为一棵子集树. 排列树:当所给的问题是确定N个元素满足某种性质的排列时,相应的解空间称为排列树,排列树通常有N!个叶节点,因此,遍历排列树需要N!的计算时间. 例如:旅行售货员问题的解空间树为一棵排列树. (2)回溯法遍历实现 1.搜索子集树 1 void backtrack (int

子集树和排列树

假设现在有一列数a[0],a[1], ...a[n-1] ①如果一个问题的解的长度不是固定的,并且解和元素顺序无关,即可以从中选择0个或多个,那么解空间的个数将是指数级别的,为2^n,可以用下面的子集树来表示所有的解 子集树的算法框架为: void backtrack(int t) {//表示访问到第t层,t从0开始 if (t == n) output(x); else for (int i = 0; i <= l; i++) { //表示选或不选a[t] x[t] = i; if (cons

回溯法 子集树和排序树

当所给问题是从n个元素的集合S中找出满足某种性质的子集时,解空间为子集树.例如:0-1背包问题 当所给问题是从n个元素的集合S中找出满足某种性质的排列时,解空间为排列树.例如:旅行售货员问题 回溯法搜索子集树算法描述为: void backtrack(int  t) { if(t>n) output(x); else for(int i=0; i<=1; i++) { x[t] = i; if(constraint(t) && bound(t)) backtrack(t+1);

排列树与子集树

子集树 子集树主要求解当前集合的所有子集,是算法中的基本思想指导.参考代码如下,以求解字符串的子集串为例子: 1 /** 2 * 子集树 3 * @param S 字符数组 4 * @param t 初始为0 5 */ 6 public void ZJTree(char[] S , int t){ 7 if(t > S.length - 1){ // 叶子节点 8 System.out.println(String.valueOf(S).replace("#","&qu

排列树

还是拿背包问题来分析吧,假设有N个背包,现在我们要对这个N个背包排列..输出所有情况 那么有:          背包                   1                   2                   3                   ...                   n                         (n个背包选一个!)      (n-1个背包选一个!)      (n-2个背包选一个!)       ...     (只剩

B树、Trie树详解

查找(二) 散列表 散列表是普通数组概念的推广.由于对普通数组可以直接寻址,使得能在O(1)时间内访问数组中的任意位置.在散列表中,不是直接把关键字作为数组的下标,而是根据关键字计算出相应的下标. 使用散列的查找算法分为两步.第一步是用散列函数将被查找的键转化为数组的一个索引. 我们需要面对两个或多个键都会散列到相同的索引值的情况.因此,第二步就是一个处理碰撞冲突的过程,由两种经典解决碰撞的方法:拉链法和线性探测法. 散列表是算法在时间和空间上作出权衡的经典例子. 如果没有内存限制,我们可以直接

JavaScript之DOM-4 文档结构和遍历(节点树、元素树、文档的遍历)

一.节点树 节点树 概念 - HTML DOM 将 HTML 文档视作树结构 - 文档中的元素.属性.文本.注释等都被看作一个节点 - 这种结构被称为节点树: 上下层节点 - 节点树中的节点彼此拥有层级关系,DOM 使用如下属性遍历整棵节点树: 平行的节点 - 节点树中使用如下方法访问平行的兄弟节点: 二.元素树 元素树 概念 - 元素树是节点树的一个子集,只包含其中的元素节点 上下层元素 - 与节点树一样,元素树上的元素节点也有父子关系,使用如下属性可以获取这些关系: 平行的元素 - 元素树使

查找(二)简单清晰的B树、Trie树具体解释

查找(二) 散列表 散列表是普通数组概念的推广.因为对普通数组能够直接寻址,使得能在O(1)时间内訪问数组中的任何位置.在散列表中,不是直接把keyword作为数组的下标,而是依据keyword计算出对应的下标. 使用散列的查找算法分为两步.第一步是用散列函数将被查找的键转化为数组的一个索引. 我们须要面对两个或多个键都会散列到同样的索引值的情况.因此,第二步就是一个处理碰撞冲突的过程,由两种经典解决碰撞的方法:拉链法和线性探測法. 散列表是算法在时间和空间上作出权衡的经典样例. 假设没有内存限

查找(二)简单清晰的B树、Trie树详解

查找(二) 散列表 散列表是普通数组概念的推广.由于对普通数组可以直接寻址,使得能在O(1)时间内访问数组中的任意位置.在散列表中,不是直接把关键字作为数组的下标,而是根据关键字计算出相应的下标. 使用散列的查找算法分为两步.第一步是用散列函数将被查找的键转化为数组的一个索引. 我们需要面对两个或多个键都会散列到相同的索引值的情况.因此,第二步就是一个处理碰撞冲突的过程,由两种经典解决碰撞的方法:拉链法和线性探测法. 散列表是算法在时间和空间上作出权衡的经典例子. 如果没有内存限制,我们可以直接