最佳调度问题 解题报告

来源:互联网 发布:数据分析表怎么做 编辑:程序博客网 时间:2024/05/28 16:11
最佳调度问题
【问题描述】
       假设有n个任务由k个可并行工作的机器完成。完成任务i需要的时间为ti。试设计一个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早。
【编程任务】
       对任意给定的整数n和k,以及完成任务i需要的时间为ti,i=1~n。编程计算完成这n个任务的最佳调度。
【输入格式】
  第一行有2 个正整数n和k。第2 行的n个正整数是完成n个任务需要的时间。
【输出格式】
      将计算出的完成全部任务的最早时间输出。
【输入样例】
7  3
2  14  4  16  6  5  3
【输出样例】
  17

【解题思路】
这道题刚开始做的时候确实没有思路。。(叫我SB)。。第三次感谢fye的帮助!!!
因为有k个并行的机器,可以看做是k个容器,然后把时间当做物品往容器里放,这样会好想很多;
所以按照每一个时间搜索,每一层枚举这个时间(物品)该往哪个容器里放,每一次传的是k个容器装的最大值;
搜索时要注意剪枝;

【代码】
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;int n,k,ans,a[1001],s[1001];void dfs(int x,int y){int i;if (ans<=y) return;//最优化剪枝:如果当前的最大值已经超过了当前已知的最小值,那么停止搜索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]);ans=2147483647;//丧心病狂别理我( ⊙ o ⊙ )dfs(1,0);printf("%d",ans);return 0;}


0 0
原创粉丝点击