飞道的博客

《蓝桥杯》30天拿下Python算法设计与分析【Day 9】

345人阅读  评论(0)

做你想做的,错的算我的

这里是Want595,欢迎光临我的世界 ~

系列文章目录

《蓝桥杯》30天拿下Python算法设计与分析 


目录

系列文章目录

前言

一、排列组合

排列

组合

二、子集和

问题一

问题二

总结 


前言

同样是一些关于回溯法的笔记 

一、排列组合

排列

输出列表的全排列


  
  1. #排列
  2. def permute(nums,solution=[]):
  3. if not nums:
  4. res. append(solution)
  5. return
  6. for i in range( len(nums)):
  7. newSolution=solution+[nums[i]]
  8. newList=nums[ 0:i]+nums[i+ 1:]
  9. permute(newList,newSolution)
  10. res=[]
  11. n= int( input())
  12. lst=[i+ 1 for i in range(n)]
  13. permute(lst)
  14. for i in res:
  15. for j in i:
  16. print(j,end= ' ')
  17. print()

定义一个permute()函数,每次传入两个参数,一个是当前列表,另一个是当前排列后列表,例如lst=[1,2,3,4]时,我们调用该函数,newSolution=[1]作为当前排列的列表,newList1=[2,3,4]作为当前列表,然后开始递归,newSolution变为了[1,2],newList变为[3,4],继续直到newSolution=[1,2,3,4]时此时nums=[],我们将solution也就是上一层的newSolution加入结果列表,然后返回上一层,并且此时newSolution=[1,2,4],newList=[3],再一直递归……

组合

输出列表的所有组合


  
  1. #组合
  2. def combination(nums,solution,n):
  3. if n== 0:
  4. res. append(solution)
  5. return
  6. for i in range( len(nums)):
  7. newList=nums[i+ 1:]
  8. newSolution=solution+[nums[i]]
  9. combination(newList,newSolution,n- 1)
  10. res=[]
  11. n= int( input())
  12. lst=[i+ 1 for i in range(n)]
  13. combination(lst,[], 2)
  14. for i in res:
  15. for j in i:
  16. print(j,end= ' ')
  17. print()

与列表的排列类似,求组合的递归也比较好理解,唯一不同的是newList保存的当前剩余列表变化了,因为组合不能重复,所以我们只需要保存i之后的元素即可,其他基本不变,多了一个参数n用来取nums中的n个数进行组合。 

二、子集和

问题一

给定一个无重复元素的数组nums和一个目标数sum,输出所有使数字和为目标数的组合


  
  1. #问题一
  2. def combinationSum(nums,sums):
  3. def helper(curSum,solution,index):
  4. if curSum>sums:
  5. return
  6. if curSum==sums:
  7. res. append(solution)
  8. return
  9. for i in range(index,n):
  10. newSum=curSum+nums[i]
  11. newSolution=solution+[nums[i]]
  12. helper(newSum,newSolution,i)
  13. n= len(nums)
  14. nums. sort()
  15. res=[]
  16. helper( 0,[], 0)
  17. return res
  18. nums= list( map(int, input(). split( ' ')))
  19. sums= int( input())
  20. lst= combinationSum(nums,sums)
  21. for i in lst:
  22. for j in i:
  23. print(j,end= ' ')
  24. print()

先定义了一个函数combination(),再定义一个子函数helper()用于递归,子函数需要三个参数,curSum代表当前的和,solution代表当前的列表,index代表当前的位置,当curSum也就是当前和等于了结果和时,我们将此时的solution放入结果列表中,表示一个结果。 

问题二

给定一个集合nums和一个目标数sum,输出所有使子集和为目标数的组合


  
  1. #问题二
  2. def combinationSum(nums,sums):
  3. def helper(curSum,solution,index):
  4. if curSum>sums:
  5. return
  6. if curSum==sums:
  7. res. append(solution)
  8. return
  9. for i in range(index, len(nums)):
  10. newSum=curSum+nums[i]
  11. newSolution=solution+[nums[i]]
  12. helper(newSum,newSolution,i+ 1)
  13. nums. sort()
  14. res=[]
  15. helper( 0,[], 0)
  16. return res
  17. nums= list( map(int, input(). split( ' ')))
  18. sums= int( input())
  19. lst= combinationSum(nums,sums)
  20. for i in lst:
  21. for j in i:
  22. print(j,end= ' ')
  23. print()

问题一和问题二的唯一区别就是是否可取重复元素,只要稍微改变一下递归条件即可。 

总结 

本章主要通过回溯法解决一些实际问题


转载:https://blog.csdn.net/m0_68111267/article/details/128620465
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场