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

题目描述
假设有 n 个任务由 k 个可并行工作的机器完成。完成任务 i 需要的时间为 ti 。试设计一
个算法找出完成这 n 个任务的最佳调度,使得完成全部任务的时间最早。
«编程任务:
对任意给定的整数 n 和 k,以及完成任务 i 需要的时间为t i ,i=1~n。编程计算完成这 n
个任务的最佳调度。
输入
第一行有 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值