Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 加权区间调度问题&;动态程序_C_Algorithm_Sum_Max_Intervals - Fatal编程技术网

C 加权区间调度问题&;动态程序

C 加权区间调度问题&;动态程序,c,algorithm,sum,max,intervals,C,Algorithm,Sum,Max,Intervals,我的问题是关于 我正在尝试将动态程序用于递归调用来实现该算法 问题陈述: 作业j开始于sj,结束于fj,并具有权重或值vj 如果两个作业不重叠,则可以兼容 目标:找到相互兼容作业的最大权重子集 books提出的解决方案是使用一个解决方案表来存储所有超问题,这些超问题在递归o迭代调用过程中需要时将被重用 解决问题的步骤如下: Input: n, s1,...,sn , f1,...,fn , v1,...,vn Sort jobs by finish times so that f1 >

我的问题是关于

我正在尝试将动态程序用于递归调用来实现该算法

问题陈述:

作业j开始于
sj
,结束于
fj
,并具有权重或值
vj

如果两个作业不重叠,则可以兼容

目标:找到相互兼容作业的最大权重子集

books提出的解决方案是使用一个解决方案表来存储所有超问题,这些超问题在递归o迭代调用过程中需要时将被重用

解决问题的步骤如下:

Input: n, s1,...,sn , f1,...,fn , v1,...,vn

Sort jobs by finish times so that f1 > f2 >... > fn.
Compute p(1), p(2), ..., p(n)
Where p(j) = largest index i < j such that job i is compatible with j.

    for j = 1 to n
       M[j] = empty <-- solution table
    M[j] = 0

    M-Compute-Opt(j) {
       if (M[j] is empty)
          M[j] = max(wj + M-Compute-Opt(p(j)), M-Compute-Opt(j-1))
       return M[j]
    }
-按完成时间对作业排序,以便f1>f2>…>fn

    int compare(const void * a, const void * b) {

        const job *ad = (job *) a;
        const job *bd = (job *) b;

        return (ad->stop - bd->stop);
    }
//Jobs is filled above by parsing a datafile
qsort(jobs, njobs, sizeof(job), compare);
计算p(1),p(2),…,p(n) 其中p(j)=最大指数i
/*bsearch for finding P(J)  */
int jobsearch(int start, int high){

        if (high == -1) return -1;

        int low = 0;
        int best = -1;
        int mid;
        int finish;

        while (low <= high){

            mid = (low + high) /2 ;
            finish = jobs[mid].stop;

            if (finish >= start){
                high = mid-1;
            }else{
                best = mid;
                low = mid + 1;
            }
        }

        return best;
    }

    int best;
        for (i = 0; i < njobs; i++){
            solutions[i] = -1l; //solutions table is initialized as -1
            best = jobsearch(jobs[i].start,i-1);

            if (best != -1)
                P[i] = best;
            else
                P[i] = 0;
        }
我用大数据(从10k到1m随机生成的作业集)对几个测试用例运行我的程序,将我的输出与预期结果进行比较。在某些情况下,它失败了。有时我的输出比预期结果大一点,有时比预期结果小一点。我显然错过了一些东西。请注意,在大多数情况下,我的输出是正确的,因此我认为有一些特殊情况我无法正确处理

我找不出问题出在哪里

谢谢你的帮助

更新: 我将递归函数更改为迭代函数,现在所有测试文件的结果都是正确的。
我再也不明白为什么递归的一个不起作用

让我们考虑琐碎的情况,一个工作。你会打电话的

long res = computeOpt(njobs-1); // computeOpt(0)
那么,你有

    if (j == 0)
        return 0;
内部
computeOpt
。所以,你不能从一份工作中赚取任何东西

在一般情况下,你似乎忽略了第一份工作,由于上述行<代码>如果(j<0)应该工作得更好


PS在进入“10k到1m随机生成的作业集”之前,始终测试简单和琐碎的情况。它们更容易验证和调试。

TNX!我从头开始重写我的程序。结束是的。最后问题得到了解决。如果我们使用递归方法,有必要在完成时对输入进行排序。我编写了一个递归解决方案,它要么接受作业,要么不接受作业,而不排序输入作业。
long res = computeOpt(njobs-1); // computeOpt(0)
    if (j == 0)
        return 0;