Problem Description
一个单位时间任务是恰好需要一个单位时间完成的任务。给定一个单位时间任务的有限集S。关于S的一个时间表用于描述S中单位时间任务的执行次序。时间表中第1个任务从时间0 开始执行直至时间1 结束,第2 个任务从时间1 开始执行至时间2 结束,…,第n个任务从时间n-1 开始执行直至时间n结束。
具有截止时间和误时惩罚的单位时间任务时间表问题可描述如下。
(1) n个单位时间任务的集合S={1,2,…,n};
(2) 任务i的截止时间di ,1≤i≤n,1≤ di ≤n,即要求任务i在时间di 之前结束;
(3) 任务i的误时惩罚wi ,1≤i≤n,即任务i未在时间di 之前结束将招致wi 的惩罚;若按时完成则无惩罚。
任务时间表问题要求确定S的一个时间表(最优时间表)使得总误时惩罚达到最小。
给定n 个单位时间任务,各任务的截止时间di ,各任务的误时惩罚wi ,1≤i≤n,计算最优时间表。
Input
输入数据的第一行是正整数n(n≤1000),表示任务数。接下来的2行中,每行有n个正整数,分别表示各任务的截止时间和误时惩罚。
Output
将计算出的最小总误时惩罚输出。
Example Input
7
4 2 4 3 1 4 6
70 60 50 40 30 20 10
Example Output
50
思路:起初我的想法就是依据惩罚值排序,但是后来写着写着发现并没有得到想要的结果,然后就弃之了,又想到用递归来做,遍历一下所有情况,结果写的乱七八糟,后来看了看别人的想法,也算是明白了,先对惩罚值排序,然后再惩罚值高的一个一个试着插入固定时间内,如果差不进去就记下来惩罚值,最后这个惩罚值就是最小的。
代码:
int change = 0;//flag
int cost = 0;//要求的结果
for (i = 0;i < all;i++)//all总数
{
for (j = taskOne[i].task-1; j >= 0;j--)//task为任务要求时间,优先考虑放在后面,给后面的时间要求小的留空间
{
if (flag[j] == 0)
{
flag[j] = 1;
change = 1;
break;
}
}
if (change == 0)
{
cost = cost + taskOne[i].fir;//fir为任务的惩罚值
}
change = 0;
}
——————————2018.2.13注—————————————–
这里加一些注解,首先是上述的排序,是按照惩罚值降序排列,再者flag数组的初始值为0。