• 7-5 最佳调度问题 (30分)


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

    输入格式:

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

    输出格式:

    将计算出的完成全部任务的最早时间输出到屏幕。

    输入样例:

    在这里给出一组输入。例如:

    7 3
    2 14 4 16 6 5 3
    

      

    输出样例:

    在这里给出相应的输出。例如:

    17
    

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    int n; // n个等待分配的任务(时间)
    int k; // k个容器(机器)    
    int best=999999; //最佳调度(最短时间),初始化为一个很大的数
    int ti[30]; // 完成任务i所需要的时间为 time【i】 , 数组名用 time 会报错 
    int total[30]={0}; // 分配完任务后,第i个容器完成任务所需要的时间总和为 total【i】,初始化为 0 
    int dep=0; // 深度,tmie【dep】表示第dep个任务需要的时间, 
                   // 每次分配完 dep+1 , 当 dep == n 时可以得到一个分配方案, 并得到该方案所需要的时间 
    
    // 计算一种分配方案所需要的时间 
    int GetTime()
    {
       int temp=0;
       for(int i=0;i<k;i++)
       {
          temp = max(total[i],temp);  //该分配方案所需要的时间 = 最后完成任务的那个容器所需要的时间 
       }    
       return temp; 
    }
    
    // 深度遍历 
    void search(int dep)  //第dep个任务的分配
    {
        if ( dep == n )  // 深度遍历到了叶子节点,得到一个分配方案,更新 best 
        {
            int Total_Time = GetTime();
            best=min(best,Total_Time); 
            return ;
        }
        for(int i=0;i<k;i++)
        {
            total[i]=total[i]+ti[dep]; // 将任务dep分给机器i
            
            // 如果机器i完成任务所需要的时间 > best , 那就没有继续往下搜索的必要了 
            if( total[i]<best )search(dep+1);   // 继续分配第 dep+1 个任务 
            
            total[i]=total[i]-ti[dep]; // 回溯,任务dep不分给机器i
                                        //i++ , 继续讨论 任务dep分配给机器i+1的情况 
         }
         
         return ; 
    }
    
    
    
    int main()
    {
        cin>>n>>k;
        for(int i=0;i<n;i++){
            cin>>ti[i]; 
        } 
    
        search(0); // 从 第0个任务的分配开始
        
        cout<<best<<endl;
        
        return 0; 
         
    }
  • 相关阅读:
    Swift学习一
    Swift开发学习(一):初始篇
    objc_msgSend arm64 崩溃问题
    更改navigationController push和pop界面切换动画
    iOS 改变UITextField中光标颜色
    IOS Core Animation Advanced Techniques的学习笔记(五)
    使用CAShapeLayer与UIBezierPath画出想要的图形
    亮相SIGGRAPH 太极拳三维教学App制作揭秘
    MySQL优化——索引
    求职前一个月复习知识
  • 原文地址:https://www.cnblogs.com/lvjingyuan/p/14048922.html
Copyright © 2020-2023  润新知