最佳调度问题
【问题描述】
假设有n个任务由k个可并行工作的机器完成。完成任务i需要的时间为ti。试设计一个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早。
【编程任务】
对任意给定的整数n和k,以及完成任务i需要的时间为ti,i=1~n。编程计算完成这n个任务的最佳调度。
【输入格式】
由文件machine.in给出输入数据。第一行有2 个正整数n和k。第2 行的n个正整数是完成n个任务需要的时间。
【输出格式】
将计算出的完成全部任务的最早时间输出到文件machine.out。
【输入样例】
7 3
2 14 4 16 6 5 3
【输出样例】
17
记住这是个np问题,证明百度上有,当k=2就是np,k等于其他贪心就是近似解
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[25],ans=0x3fffff,b[25];
int n,k;
void dfs(int dep,int val)
{
if(dep==n+1)
{
if(val<ans)ans=val;
return;
}
for(int i=1;i<=k;i++)
{
if(b[i]+a[dep]<ans)
{
b[i]+=a[dep];
dfs(dep+1,max(val,b[i]));
b[i]-=a[dep];
}
}
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
dfs(1,0);
cout<<ans;
}