算法导论-15-7-达到最高效益的调度
2016-06-13 00:00
423 查看
一、题目
二、思考
背包问题:P01: 01背包问题。令s[i,j]表示考虑前i个背包,在时间j之前能够获得的最大效益。
初始化:s[i][0] = 0
递推公式:s[i][j] = max{s[i-1][j], s[i-1][j-time[i]+pro[i]),其中前者代表如果不处理第i个作业s[i][j]能取得的最大值,后者表示如果做第i个作业s[i][j]能取得的最大值。
优化:空间复杂度优化、常数优化
三、代码
#include <iostream> #include <algorithm> using namespace std; #define N 10//最多N个任务 #define M 10//任务的最后完成时间小于M //每个作业作为一个结点 struct node { int time;//处理时间 int productivity;//效益 int deadline;//最后期限 }work ; //对所有作业按照最后期限从小到大排序 bool cmp(node a, node b) { return a.deadline < b.deadline; } int s[M] = {0}; //01背包 void ZeroOnePack(int cost, int weight, int V) { int v; for(v = V; v >= cost; v--) s[v] = max(s[v], s[v-cost] + weight); } int main() { int n, i, j, last, ret; while(cin>>n) { last = -1;ret = 0; memset(s, 0, sizeof(s)); //输入n个作业 for(i = 0; i < n; i++) { //生成随机的测试数据 work[i].time = rand() % N; work[i].productivity = rand() % N; work[i].deadline = rand() % M; cout<<work[i].time<<' '<<work[i].productivity<<' '<<work[i].deadline<<endl; // cin>>work[i].time>>work[i].productivity>>work[i].deadline;//或自己输入测试数据 if(work[i].deadline > last) last = work[i].deadline; } //对所有作业按照最后期限从小到大排序 sort(work, work + n, cmp); for(i = 0; i < n; i++) { ZeroOnePack(work[i].time, work[i].productivity, work[i].deadline); } //输出结果 for(i = 0; i <= last; i++) if(s[i] > ret) ret = s[i]; cout<<ret<<endl; } return 0; }
相关文章推荐
- 算法导论 第10章 10.4 有根树的表示
- 算法导论 第13章 红黑树
- 算法导论 第7章 快速排序
- 算法导论 第12章 二叉查找树
- 算法导论-24.2-有向无回路图中的单源最短路径
- 算法导论 第10章 10.1 栈和队列
- 算法导论 11.1-4 大数组的直接寻址表
- 算法导论-14-1-最大重叠点
- 算法导论-12-2-基数树
- 算法导论-14-2-Josephus排列
- 算法导论-8-3-排序不同长度的数据项
- 算法导论 10.4-2 O(n)时间 递归遍历二叉树
- 算法导论-9.3-3-快速排序-最坏时间O(nlgn)
- 算法导论-24.1-Bellman-Ford算法
- 算法导论-15-1-双调欧几里得旅行商问题
- 算法导论-13-3-AVL树
- 算法导论 第22章 图算法 22.2 广度优先搜索
- Accepted丶 Personal Training (数据结构 && STL) 【未完待续】
- 数据结构与算法之八 队列
- 数据结构与算法之八 队列