问题描述
有N根木棍,需要将其粘贴成M个长木棍,使得最长的和最短的的差距最小。
输入格式
第一行两个整数N,M。
一行N个整数,表示木棍的长度。
输出格式
一行一个整数,表示最小的差距
样例输入
3 2
10 20 40
样例输出
10
数据规模和约定
N, M<=7
#include <iostream>
using namespace std;
int num[10] = { 0 };
int n, m;
int ans = 10000;
void dfs(int temp) {
if (temp == m) {
int maxNum = -100;
int minNum = 10000;
for (int i = 0; i < temp; i++) {
if (maxNum < num[i]) {
maxNum = num[i];
}
if (minNum > num[i]) {
minNum = num[i];
}
}
ans = min(ans, maxNum - minNum);
return;
} else {
for (int i = 0; i < temp; i++) {
for (int j = i + 1; j < temp; j++) {
num[i] += num[j];
swap(num[j], num[temp - 1]);
dfs(temp - 1);
swap(num[j], num[temp - 1]);
num[i] -= num[j];
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> num[i];
}
dfs(n);
cout << ans;
return 0;
}
总结:
还是穷举法,每次都把两个数加起来,然后去掉已经被加过的数,去掉的方法是交换被加的那个书和最后那个数,最后让数组的长度-1,这样相当于去掉了那个被加的数
这样递归下来,就能找到n-m个最大最小的差值
找出其中最小的差值