排列組合(遍歷)回溯法

2021-10-24 09:24:27 字數 2250 閱讀 5377

這裡有乙個回溯函式,使用第乙個整數的索引作為引數 backtrack(first)。

1,如果第乙個整數有索引 n,意味著當前排列已完成。

2,遍歷索引 first 到索引 n-1 的所有整數 ,則:

在排列中放置第 i 個整數,即 swap(nums[first], nums[i])

繼續生成從第 i 個整數開始的所有排列:backtrack(first +1)

現在回溯,通過 swap(nums[first], nums[i]) 還原。

class solution:

def permute(self, nums):

""":type nums: list[int]

:rtype: list[list[int]]

"""def backtrack(first = 0):

# if all integers are used up

if first == n:

for i in range(first, n):

# place i-th integer first

# in the current permutation

nums[first], nums[i] = nums[i], nums[first]

# use next integers to complete the permutations

backtrack(first + 1)

# backtrack

nums[first], nums[i] = nums[i], nums[first]

n = len(nums)

output =

backtrack()

return output

class solution:

def solvepermutation(self, array):

self.helper(array, )

def helper(self, array, solution):

if len(array) == 0:

print(solution)

return

for i in range(len(array)):

newarray = array[:i] + array[i + 1:] # 刪除書本

newsolution = solution + [array[i]] # 加入新書

self.helper(newarray, newsolution) # 尋找剩餘物件的排列組合

solution().solvepermutation(["紅", "黃", "藍", "綠"])

li = ['a', 'b', 'c', 'd']

def solutoin(li):

import itertools

res = list(itertools.permutations(li))

return len(res)

例題:

小明想上兩門選修課,他有四種選擇:a微積分,b**,c烹飪,d設計,小明一共有多少種不同的選課組合?

li = ['a', 'b', 'c', 'd']

def solutoin(li):

import itertools

res = list(itertools.permutations(li, 2))

return len(res)

class solution():

def solvecombination(self, array, n):

self.helper(array, n, )

def helper(self, array, n, solution):

if len(solution) == n:

print(solution)

return

for i in range(len(array)):

newarray = array[i + 1:] # 建立新的課程列表,更新列表,即選過的課程不能再選

newsolution = solution + [array[i]] # 將科目加入新的列表組合

self.helper(newarray, n, newsolution)

solution().solvecombination(["a", "b", "c", "d"], 2)

排列組合與回溯演算法

排列組合與回溯演算法 在開始之前,我們先應該看一下回溯演算法的概念,所謂回溯 就是搜尋一棵狀態樹的過程,這個過程類似於圖的深度優先搜尋 dfs 在搜尋的每一步 這裡的每一步對應搜尋樹的第i層 中產生乙個正確的解,然後在以後的每一步搜尋過程中,都檢查其前一步的記錄,並且它將有條件的選擇以後的每乙個搜尋...

排列組合與回溯演算法

排列組合與回溯演算法 kuibing 感謝bamboo leemars的幫助 關鍵字 遞迴dfs 前言 這篇 主要針對排列組合對回溯演算法展開討論,在每乙個討論之後,還有相關的推薦題。在開始之前,我們先應該看一下回溯演算法的概念,所謂回溯 就是搜尋一棵狀態樹的過程,這個過程類似於圖的深度優先搜尋 d...

排列組合 隔板法

1 定義 隔板法就是在n個元素間插入 b 1 個板,即把n個元素分成b組的方法。c n 1,b 1 2 條件 隔板法必須滿足三個條件 1 這n個元素必須相同,2 所分成的每一組至少分得乙個元素,3 分成的組別彼此差異。3 示例 1 例如 某校組建一球隊需16人,該校共10個班級,且每個班至少分配乙個...