您的位置:首页 > 理论基础 > 数据结构算法

算法导论-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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: