题⽬描述
大秘书
假设有 n 个任务由 k 个可并⾏⼯作的机器完成。完成任务 i 需要的时间为 ti 。试设计⼀个算法出完成这 n 个任务的最佳调度,使得完成全部任务的时间最早。 «编程任务:
对任意给定的整数 n 和 k,以及完成任务 i 需要的时间为t i ,i=1~n。编程计算完成这 n
个任务的最佳调度。
输⼊
logo语言第⼀⾏有 2 个正整数 n 和 k。第 2 ⾏的 n 个正整数是完
成 n 个任务需要的时间。
输出
将计算出的完成全部任务的最早时间输出
样例输⼊
7 3
2 14 4 16 6 5 3
样例输出
17
k个机器可以看作k个容器,按照每⼀个时间搜索,每⼀层枚举这个时间(物品)该往哪个容器⾥放,每⼀次传的是k个容器装的最⼤值;代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int n,k,ans=0xffffff,a[1001],s[1001];
int cmp(int a,int b)
{
return a>b;
}
void dfs(int x,int y)
{
int i;
if (ans<=y) return;//最优化剪枝:如果当前的最⼤值(y)已经超过了当前已知的最⼩值,那么停⽌搜索
if (x==n+1)
{
if (ans>y) ans=y;
return; //回溯
}
for (i=1;i<=k;++i)//枚举每⼀个容器
if (s[i]+a[x]<ans)//最优化剪枝:往容器⾥放的时候不能超过当前已知的最⼩值
{
s[i]+=a[x];//将枚举到的时间(物品)放⼊容器
dfs(x+1,max(y,s[i]));//搜索下⼀层,第⼆个关键字是当前k个容器⾥的最⼤值
s[i]-=a[x];//回溯⼀步中学数理化
}
农业生产资料市场监督管理办法return;
}
int main()
{环球中医网
int i;
scanf("%d%d",&n,&k);
for (i=1;i<=n;++i)
scanf("%d",&a[i]);
sort(1+a,a+1+n,cmp); //没有这个可能会超时
dfs(1,0);
printf("%d",ans);
长岛的雪
return 0;
}