最佳调度问题 解题报告
来源:互联网 发布:数据分析表怎么做 编辑:程序博客网 时间: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
- 最佳调度问题 解题报告
- 最佳调度问题
- 最佳调度问题
- 【9506】最佳调度问题
- 最佳调度问题
- 最佳调度问题
- 【浇水问题】解题报告
- 【过河问题】解题报告
- 石子问题解题报告
- 装载问题 解题报告
- 迷宫问题 解题报告
- 零点问题 解题报告
- 【解题报告】硬币问题
- 核电站问题 解题报告
- 洛谷P3074牛奶调度解题报告
- NOI1994 最佳旅游路线 解题报告
- 动态规划解机器调度问题——算法解题报告
- 最佳调度问题6_8
- linux怎么设置默认启动到字符界面,而非图形界面
- 样式 控制字符宽度,隐藏或换行
- 十道海量数据处理面试题与十个方法大总结
- Linux 统计某个字符串出现的次数
- 白话Android进程交互之--Binder原理
- 最佳调度问题 解题报告
- Ubuntu 12.04 root用户登录设置
- 程序能正常下载,但是无法执行,卡在NVIC_Configuration
- query插件中(function ( $, window, document, undefined )的作用
- System.Data.SqlClient.SqlException (0x80131904): Timeout 时间已到
- 博弈论之SG函数
- 复制class文件到as中出现非法字符,需要class,interface货enum
- 121. Best Time to Buy and Sell Stock
- 前端拼接数组