zoukankan      html  css  js  c++  java
  • 全排列相关的

    一、给一个列表,输出其中元素的所有组合情况,全排列问题。例如[1,2,3],一共有6中组合情况。

    def permutation(arr,start,end):
      #分割递归到相等的时候,说明已经递归到只有一个元素的时候了,这个时候可以打印出来了
    if start==end: for val in arr: print(val,end=' ') print('') return for i in range(start,len(arr)):
         #每次都要交换一下,谁做第一个 arr[i],arr[start]
    =arr[start],arr[i]
         #递归得到出去第一个后面的全排列组合 permutation(arr,start
    +1,end)
       #交换后还要再交换回来,因为下次后面的还要和第一个交换,这样就固定第一个,否则来回交换就乱了 arr[i], arr[start]
    = arr[start], arr[i]

    二、输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

    def compare(a,b):
        if str(a)+str(b)>str(b)+str(a):
            return 1
        elif str(a)+str(b)<str(b)+str(a):
            return -1
        else:
            return 0
    
    def printMin(arr):
        from functools import cmp_to_key
        key = cmp_to_key(compare)
        tmp=[str(x) for x in sorted(arr,key=key)]
        return ''.join(tmp)

     基本思想:就是两两元素拼成一个字符串数字进行比较,把拼成最小的那种方式就是两个元素的排序方式,例如:1,12 可以拼成112和121,显然112<121,所以两者的位置就是1,12。按顺序排完之后,按这个顺序组成的数字就是最小的数字。

    三、求一个组合函数: 如p([1,2,3]) ,输出:[1],[2],[3],[1,2],[2,3],[1,3],[1,2,3]

      1)先写一个combine函数,求出C(m,n),从m中找出n个数的组合情况

    def combine(arr,m,n):
        global k
        if k==0:
            k=n
        if m<n or n==0:
            return
        for i in range(m,n-1,-1):
            arr[n - 1] = i
            if n-1>0:
                combine(arr,i-1,n-1)
            else:
                print(arr[:k])
    
    a=[1,2,3,4]
    k=0
    combine(a,len(a),3)

     2)打印出所有组合情况:

    def combine(arr,m,n):
        global k
        if k==0:
            k=n
        if m<n or n==0:
            return
        for i in range(m,n-1,-1):
            arr[n - 1] = i
            if n-1>0:
                combine(arr,i-1,n-1)
            else:
                print(arr[:k])
    
    a=[1,2,3]
    for i in range(1,len(a)+1):
        k=0
        combine(a,len(a),i)
  • 相关阅读:
    Java 添加OLE对象到Excel文档
    【51Nod1769】Clarke and math2(数论,组合数学)
    【UOJ#308】【UNR#2】UOJ拯救计划
    【UOJ#390】【UNR#3】百鸽笼(动态规划,容斥)
    【UOJ#389】【UNR#3】白鸽(欧拉回路,费用流)
    【UOJ#388】【UNR#3】配对树(线段树,dsu on tree)
    【UOJ#386】【UNR#3】鸽子固定器(贪心)
    【Wannafly挑战赛29F】最后之作(Trie树,动态规划,斜率优化)
    【洛谷5439】【XR-2】永恒(树链剖分,线段树)
    【洛谷5437】【XR-2】约定(拉格朗日插值)
  • 原文地址:https://www.cnblogs.com/gczr/p/8365600.html
Copyright © 2011-2022 走看看