问题描述
有N根木棍,需要将其粘贴成M个长木棍,使得最长的和最短的的差距最小。
输入格式
第一行两个整数N,M。
一行N个整数,表示木棍的长度。输出格式
一行一个整数,表示最小的差距
样例输入
3 2
10 20 40样例输出
10
数据规模和约定
N, M<=7
1.我的思路:
这道题涉及到了深度优先搜索算法,递归与回溯的知识。让列表中任意的两个元素a和b相加得到c,再从列表中删除元素a和元素b的同时 加入元素c,重复这样的操作,直到列表长度为m。
2.什么是深度优先算法?
100分代码如下:
# 2022.3.16 # 蓝桥杯算法训练-粘木棍 # 知识点:深度优先搜索算法 # 我的思路:让列表中任意的两个元素a和b相加得到c,再从列表中删除元素a和元素b的同时 # 加入元素c,重复这样的操作,直到列表长度为m。为此我使用深度优先搜索算法,其中 # 包含了递归与回溯的知识。 n, m = list(map(int, input().split())) nums = list(map(int, input().split())) results = [] def dfs(nums): global m, results lenth = len(nums) if lenth == m: # 递归出口 #print(nums) x = max(nums) - min(nums) results.append(x) return for i in range(lenth): a = nums[i] nums2 = nums.copy() # 须在新的列表上进行操作,否则会影响i的下一次循环 nums2.pop(i) # 选择i与嵌套循环中的j相加,且删除i和j lenth2 = len(nums2) for j in range(lenth2): # 遍历删除i之后的列表 b = nums2[j] a = a + b nums3 = nums2.copy() # 为了避免影响j的下一次循环 nums3.pop(j) nums3.insert(i, a) dfs(nums3) # 递归入口 a = a - b # 回溯 dfs(nums) print(min(results))