资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
有N根木棍,需要将其粘贴成M个长木棍,使得最长的和最短的的差距最小。
输入格式
第一行两个整数N,M。
一行N个整数,表示木棍的长度。
输出格式
一行一个整数,表示最小的差距
样例输入
3 2
10 20 40
样例输出
10
数据规模和约定
N, M<=7
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
const int N=10;
int n,m;
int a[N],d[N];//d[j]为第j根粘起来的大木棍长度
int w=0x3f3f3f3f;
bool st[N];
void dfs(int u){
if(u==n){
int d_min,d_max;
d_min=*min_element(d,d+m);
d_max=*max_element(d,d+m);
w=min(w,d_max-d_min);
return;
}
for(int i=u;i<n;i++){//将第i个小木棍粘到第j个大木棍上
if(!st[i]){
st[i]=true;
for(int j=0;j<m;j++){//粘到第j个大木棍上
d[j]+=a[i];
dfs(u+1);
d[j]-=a[i];
}
st[i]=false;
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
dfs(0);
printf("%d\n",w);
return 0;
}
思路:dfs。从第1个小木棍开始,依次将其粘到m个大木棍上,如果粘上后差距最小则返回,反之则将这个木棍拿走,不粘上去。
注意:for循环中,i从u开始(前面的u-1个小木棍已经尝试着粘过):
for(int i=u;i<n;i++){//将第i个小木棍粘到第j个大木棍上
if(!st[i]){
st[i]=true;
for(int j=0;j<m;j++){//粘到第j个大木棍上
d[j]+=a[i];
dfs(u+1);
d[j]-=a[i];
}
st[i]=false;
}
}
如果i从0开始,运行可能会超时。