最佳调度问题(剪枝加搜索)

最佳调度问题(剪枝加搜索)
题⽬描述
大秘书假设有 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;
}

本文发布于:2024-09-22 17:38:28,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/284600.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:完成   任务   时间   全部   剪枝   调度
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议