1. 题目描述
假设有n(n<=20)个任务由k(k<=20)个可并行工作的机器完成。完成任务i需要的时间为ti。
试设计一个算法,对任意给定的整数n和k,以及完成任务i 需要的时间为ti
,i=1~n。计算完成这n个任务的最佳调度,使得完成全部任务的时间最早。
2. 输入格式:
输入数据的第一行有2 个正整数n和k。第2 行的n个正整数是完成n个任务需要的时间。 输出格式:
将计算出的完成全部任务的最早时间输出到屏幕。
3. 输入样例:
在这里给出一组输入。例如:
7 3
2 14 4 16 6 5 3
4. 输出样例:
在这里给出相应的输出。例如:
17
5. 解题思路
将k个时间看成k个容器,n个时间往里边放。给各个容器分配时间,在这个过程中会有m套方案,求出某套方案中三个容器中时间最多的,即完成全部任务的最早时间
脑海中要有n叉树
#include <bits/stdc++.h>
using namespace std;
int n, k;
int a[1001]; // 存放时间
int x[1001]; // 存放分给每台机器的时间
int res = 999999; //最优时间
void dfs(int j, int s){ //j时间数组下标#
if(j > n) // 说明到了叶子节点
if(s < res)
res = s; // 找到当前最优解 更新
if(s >= res)
return;
for(int i = 0; i < k; i++){
if(x[i] + a[j] < res){ // res可以动态变化 目的是求全过程的最优时间
x[i] += a[j];
/*下一句是灵魂
1. 目的是求三台机器中用时最多的
2. 同一台机器时,x[i]自然比s大
3. 不同台机器时,x[i]不一定比s大
*/
dfs(j + 1, max(s, x[i]));
x[i] -= a[j];
}
}
}
int main(){
cin >> n >> k;
for(int i = 0; i < n; i++)
cin >> a[i];
dfs(0, 0);
cout << res;
return 0;
}