假设有n个任务由k个可并行工作的机器完成,完成任务i需要的时间为ti,对任意给定的整数n和k,以及完成任务i需要的时间ti,设计一个算法,求完成这n个任务的最佳调度,使得完成全部任务的时间最早。
第一行有2个正整数n和k,第二行有n个正整数,表示ti
n<7000,c<maxlongin
样例输入
7 3
2 14 4 16 6 5 3
样例输出
17
#include<bits/stdc++.h>
using
namespace
std;
long
long
n,m,a[7001],z[7001],ans=10000000000;
inline
void
dfs(
int
k,
long
long
zhi)
{
if
(k==n)
{
ans=min(ans,zhi);
return
;
}
if
(zhi>=ans)
return
;
for
(
int
i=0;i<m;i++)
{
if
(z[i]+a[k]<=ans){
z[i]+=a[k];
dfs(k+1,max(zhi,z[i]));
z[i]-=a[k];
}
}
}
bool
qwe(
int
a,
int
b)
{
return
a>b;
}
int
main()
{
cin>>n>>m;
for
(
int
i=0;i<n;i++)
{
scanf
(
"%d"
,&a[i]);
}
sort(a,a+n,qwe);
dfs(0,0);
cout<<ans;
}
dfs数据类型前的inline把时间由152ms->140ms,
由大到小排序,把时间从2000++ms->152ms