资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
有N根木棍,需要将其粘贴成M个长木棍,使得最长的和最短的的差距最小。
输入格式
第一行两个整数N,M。
一行N个整数,表示木棍的长度。
输出格式
一行一个整数,表示最小的差距
样例输入
3 2
10 20 40
样例输出
10
数据规模和约定
N, M<=7
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstring>
#define inf 0x3f3f3f3f
using namespace std ;
const int N = 1008 ;
typedef long long ll ;
int n, m ;
int num[N], sol[N] ;
int v[N] ;
int ans = inf ;
void dfs(int step, int pos) {
if (step > n) {
int ma = sol[1], mi = sol[1] ;
for (int i = 1 ; i <= m ; i ++) {
ma = max(ma, sol[i]) ;
mi = min(mi, sol[i]) ;
}
ans = min(ans, ma - mi) ;
return ;
}
for (int i = pos ; i <= n ; i ++ ) {
for (int j = 1 ; j <= m ; j ++) {
if (v[i] != 1) {
v[i] = 1 ;
sol[j] += num[i] ;
dfs(step + 1, pos + 1) ;
v[i] = 0 ;
sol[j] -= num[i] ;
}
}
}
}
int main() {
std::ios::sync_with_stdio(false) ;
std::cin.tie(0) ;
cin >> n >> m ;
for (int i = 1 ; i <= n ; i ++) {
cin >> num[i] ;
}
dfs(1, 1) ;
cout << ans << '\n' ;
return 0 ;
}