/*
信息学奥赛题目解析:最佳调度问题
【问题描述】
假设有n个任务由k个可并行工作的机器完成。完成任务i需要的时间为ti。试设计一个算法找出完成这
n个任务的最佳调度,使得完成全部任务的时间最早。
【编程任务】
对任意给定的整数n和k,以及完成任务i需要的时间为ti,i=1~n。编程计算完成这n个任务的最佳调度。
【任务解析】
这个任务有很多方案,且没有规律,只能把每种方案穷举出来,在琼剧的过程中,得出最小耗时。
【例程】
*/
#include<cstdio>
#include<climits>
#include<cstring>
int n,k,a[101],f[1001],ans;
int max(int x,int y)//求x、y两数中较大者
{
if (x>y) return x;
else return y;
}
void find(int x,int y)
{
int i;
if (y>=ans) return;//数据有误
if (x>n)
{
if (y<ans) ans=y;//获取结果
return;
}
//递归查找所有可能的方式并
//获取时间最小的那个方案耗费时间
for(i=1;i<=k;i++)
{
f[i]=f[i]+a[x];
find(x+1,max(y,f[i]));
f[i]=f[i]-a[x];
}
}
int main()
{
int i;
//输入任务数和机器数
scanf("%d%d",&n,&k);
//输入任务耗时
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
//初始化数组f
memset(f,0,sizeof(f));
ans=INT_MAX;//INT_MAX为非常大的一个数
find(1,0);//递归获取结果
printf("%d",ans);//输出结果
}