最佳调度问题

题目描述
假设有n 个任务由k 个可并行工作的机器来完成。完成任务i 需要的时间为ti。试设计一个算法找到出完成这个n 个任务的最佳调度,使得完成全部任务的时间最早。
对任意给定的整数n 和k,以及完成任务i 需要的时间为ti,1<=i<=n。编程计算完成这n 个任务的最佳调度。
n<=20,k<=8


输入
第1 行有2 个正整数n 和k。第2 行的n 个正整数是完成n 根任务
需要的时间。


输出
计算出的完成全部任务的最早时间

样例输入
7 3
2 14 4 16 6 5 3

样例输出
17

 

搜索水题,开一个数组sum[i]表示第i个机器上花费的时间,所以每一次将所有任务交给机器后,跑一遍sum[]求最大值,代表完成全部任务需要的时间。然后与ans求最小。

然而这么会超时。

所以还是动态更新最小值吧。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<cstring>
 6 using namespace std;
 7 #define rep(i, a, n) for(int i = a; i <= n; ++i)
 8 #define per(i, n, a) for(int i = n; i >= a; --i) 
 9 const int maxn = 1e3 + 5;
10 const int INF = 0x3f3f3f3f;
11 int n, k, a[maxn], mach[maxn];
12 int ans = INF;
13 bool cmp(int a, int b)
14 {
15     return a > b;
16 }
17 void dfs(int step, int Max)
18 {
19     if(step == n + 1)
20     {
21         if(Max < ans) ans = Max; return;
22     }
23     if(Max > ans) return;
24     rep(i, 1, k)
25     {
26         if(mach[i] + a[step] > ans) continue; 
27         mach[i] += a[step];
28         dfs(step + 1, max(Max, mach[i]));
29         mach[i] -= a[step];
30     }
31 }
32 int main()
33 {
34     freopen("machine.in", "r", stdin);
35     freopen("machine.out", "w", stdout);
36     scanf("%d%d", &n, &k);
37     rep(i, 1, n) scanf("%d", &a[i]);
38     sort(a + 1, a + n + 1, cmp); 
39     mach[1] += a[1];
40     dfs(2, a[2]);
41     printf("%d\n", ans);
42     return 0;
43 }

 

posted @ 2018-03-24 15:53  mrclr  阅读(460)  评论(0编辑  收藏  举报