• 最佳调度问题


    题目描述
    假设有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
    ", ans);
    42     return 0;
    43 }
  • 相关阅读:
    Java中“==”与equals的区别以及equals方法的重写
    Java中的Switch....case语句:
    Java中的基本数据类型
    HTTP与HTTPS的区别
    深入理解HTTP协议、HTTP协议原理分析
    IntelliJ IDEA下的使用git
    Spring RestTemplate详解
    Java 适配器(Adapter)模式
    LINUX的ssh免密码配置
    CDH6.2安装配置第一篇:CDH配置本地http服务
  • 原文地址:https://www.cnblogs.com/mrclr/p/8639359.html
Copyright © 2020-2023  润新知