最佳调度问题
题目描述
假设有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 }