资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
有N根木棍,需要将其粘贴成M个长木棍,使得最长的和最短的的差距最小。
输入格式
第一行两个整数N,M。
一行N个整数,表示木棍的长度。
输出格式
一行一个整数,表示最小的差距
样例输入
3 2
10 20 40
样例输出
10
数据规模和约定
N, M<=7
代码(dfs):
import math
n, m = list(map(int, input().split()))
q = list(map(int, input().split()))
res = 2e9
def dfs(u):
global res, q, m
if u == m:
mi, ma = 2e9, -2e9
for i in range(m):
if q[i] < mi:
mi = q[i]
if q[i] > ma:
ma = q[i]
if res > ma-mi:
res = ma-mi
return
for i in range(u):
for j in range(i+1, u):
q[i] = q[i] + q[j]
# 合并两个元素后,删除多余的元素,这里操作是把它和末尾的元素交换,
#然后进入下层的时候 u - 1,就跟它说拜拜了。回溯只要交换回来,并把合并元素减去它就行
q[j], q[u-1] = q[u-1], q[j]
dfs(u-1)
q[j], q[u-1] = q[u-1], q[j]
q[i] = q[i] - q[j]
dfs(n)
print("%d"%res)