排列树

还是拿背包问题来分析吧,假设有N个背包,现在我们要对这个N个背包排列。。输出所有情况

那么有:

         背包                   1                   2                   3                   ...                   n         
               (n个背包选一个!)      (n-1个背包选一个!)      (n-2个背包选一个!)       ...     (只剩下一个背包啦!凑合用着吧!)

生动点形容整个场景,存在N个人
  第一步,在这N个人中找一个人轮流坐在第一个位置上
  第二步,在这N-1个人中找一个人轮流坐在第一个位置上 第一个位置已经固定人了
  第三步,在这N-2个人中找一个人轮流坐在第一个位置上 第一/二个位置已经固定人了
  第四步,在这N-3个人中找一个人轮流坐在第一个位置上 第一/二/三个位置已经固定人了

。。。。

#!/usr/bin/env python
# coding=utf-8

# 排列树
def perm(arr, k):
    arrLen = len(arr)
    if arrLen  == k:
        print arr
        return

    # [0, k) 区间都是确定好的元素,不能再搞他们的位置了。。。。
    for index in range(k, arrLen):

        # 第k层考虑下用arr数组的index 号元素?
        temp = arr[index]
        arr[index] = arr[k]
        arr[k] = temp

        perm(arr, k + 1)

        # 第k层考虑下不再用arr数组的index 号元素了
        temp = arr[index]
        arr[index] = arr[k]
        arr[k] = temp

arr = [1, 2, 3]
num = 0
perm(arr, num)

原文地址:https://www.cnblogs.com/ccXgc/p/8992228.html

时间: 2024-10-17 11:58:37

排列树的相关文章

子集树和排列树

假设现在有一列数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背包问题所相应的解空间树就是一颗子集树.这类子集问题通常有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)

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

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

排列树与子集树

子集树 子集树主要求解当前集合的所有子集,是算法中的基本思想指导.参考代码如下,以求解字符串的子集串为例子: 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

【20181030T1】排列树【树形结构+组合数】

题面 [正解] 一眼找规律 --**这东西有啥规律啊 哎好像根节点是最小的 好像可以组合数分配子树大小,子树内部-- 可以递归啊! 乱搞一顿就好啦 过了大样例 复杂度\(O(N)\) 切完T2后T3水了一下,回来写了个\(O(N!)\)和T2同时对拍,没啥问题 检查了一下long long,没毛病 造了个1e6的菊花图,没爆 造了个1e6的链,然后爆栈了?????? 后来想了一下,1e6的树很常见,应该不会卡 然后交了就A了 代码 原文地址:https://www.cnblogs.com/lst

回溯法 子集树和排序树

当所给问题是从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);

leetcode树专题894.897,919,951

满二叉树是一类二叉树,其中每个结点恰好有 0 或 2 个子结点. 返回包含 N 个结点的所有可能满二叉树的列表. 答案的每个元素都是一个可能树的根结点. 答案中每个树的每个结点都必须有 node.val=0. 你可以按任何顺序返回树的最终列表. 示例: 输入:7 输出:[[0,0,0,null,null,0,0,null,null,0,0],[0,0,0,null,null,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,null,null,null,null,0,0],

897. 递增顺序查找树

给定一个树,按中序遍历重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点. 示例 : 输入:[5,3,6,2,4,null,8,1,null,null,null,7,9] 5 / 3 6 / \ 2 4 8  / / \ 1 7 9 输出:[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9] 1     2     3     4     5     6     7     8   9 提示:

897.递归顺序查找树

给你一个树,请你 按中序遍历 重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点. 示例 : 输入:[5,3,6,2,4,null,8,1,null,null,null,7,9] 5 / 3 6 / \ 2 4 8 / / \ 1 7 9 输出:[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9] 1 2 3 4 5 6 7 8 9 提示: 给定树中的结点数介于 1 和 100 之间. 每个结点