最佳调度问题

假设有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
posted @ 2019-07-08 22:11  fanhao110  阅读(841)  评论(0编辑  收藏  举报