非单位时间任务安排问题
2015-11-24 21:14
267 查看
#include <iostream> #include <fstream> #include <algorithm> using namespace std; /* 首先将任务按其截止时间非减序排序 p(i, d)表示对任务1,2..i,截止时间为d的最小误时惩罚 p(i, d) = min{ p(i-1, d)+wi, p(i-1, min{d, di}-ti) } p(1, d) = 0 t1<=d p(1, d) = w1 t1>d */ const int INF = 100000; const int MAX = 50; int p[MAX][200]; struct Task { int t; //完成任务需要的时间 int d; //截止时间 int w; //误时惩罚 bool operator < (const Task &ta) const { return d < ta.d; } }; Task task[MAX]; // int greedy(int n) { sort(task, task+n); //按截止时间排序 int d = task[n-1].d; //最大截止时间 int i, j; //for(i=0; i<n; i++) //for(j=0; j<=d; j++) //p[i][j] = INF; for(i=0; i<=d; i++) if(i > task[0].t) p[0][i] = 0; else p[0][i] = task[0].w; for(i=1; i<n; i++) for(j=0; j<=d; j++) { p[i][j] = p[i-1][j] + task[i].w; int jj = task[i].d > j? j : task[i].d; if(jj >= task[i].t && p[i][j]>p[i-1][jj-task[i].t]) p[i][j] = p[i-1][jj-task[i].t]; } return p[n-1][d]; } int main() { ifstream fin("任务安排.txt"); cout << "输入任务数:"; int n; fin >> n; cout << n; cout << "\n输入完成任务需要的时间,截止时间,误时惩罚:\n"; int i; for(i=0; i<n; i++) { fin >> task[i].t >> task[i].d >> task[i].w; cout << task[i].t << " " << task[i].d << " " << task[i].w << endl; } cout << "最小误时惩罚为:" << greedy(n); cout << endl; fin.close(); return 0; }
相关文章推荐
- sed
- WordPress主题制作入门(3)-后台制作
- qt/c++ 实现二维码生成(利用qrencode)
- Android使用XMPP协议、Openfire服务器和Smack类库实现即时通信
- Linux重定向:将标准输出stdout和标准错误stderr重定向到一个文件
- 机器视觉入门知识总结
- 转载:java集合类数据结构分析
- 【IOS】UILabel 属性及方法
- 搜索 Arithmetic Puzzles
- 对Python中文分词模块结巴分词算法过程的理解和分析
- hud 2586 How far away ?
- Hadoop学习笔记(一)Hadoop的单节点安装
- Hadoop学习笔记(一)Hadoop的单节点安装
- 选夫婿1
- rhel-server-7.1更换yum源(CentOS7)
- Hadoop学习笔记(一)Hadoop的单节点安装
- wzben的QQ空间
- 第二次实验
- 【数据压缩】LZ77算法原理及实现
- 邮件客户端相关问题汇总