我已经取了这个C++中的例子
http://www.geeksforgeeks.org/weighted-job-scheduling-log-n-time/
这是C实现

#include <stdio.h>
#include <stdlib.h>

#define max(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a > _b ? _a : _b; })

//#ifndef max
//    #define max(a,b) ((a) > (b) ? (a) : (b))
//#endif

struct rent
{
    int starttime, endtime, profit;
};

int sort_event(const void * st1, const void * st2)
{
    struct rent s1, s2;
    s1.endtime = *(int*)st1;
    s2.endtime = *(int*)st2;
    return (s1.endtime < s2.endtime);
}

int binarySearch(struct rent rents[], int index)
{
    // Initialize 'lo' and 'hi' for Binary Search
    int lo = 0, hi = index - 1;

    // Perform binary Search iteratively
    while (lo <= hi)
    {
        int mid = (lo + hi) / 2;
        if (rents[mid].endtime <= rents[index].starttime)
        {
            if (rents[mid + 1].endtime <= rents[index].starttime)
                lo = mid + 1;
            else
                return mid;
        }
        else
            hi = mid - 1;
    }

    return -1;
}

int findMaxProfit(struct rent arr[], int n)
{
    qsort(arr, sizeof(arr+n), sizeof(int), sort_event);

    int *table = (int *) malloc(sizeof(n));
    table[0] = arr[0].profit;

    // Fill entries in table[] using recursive property
    for (int i=1; i<n; i++)
    {
        // Find profit including the current job
        int inclProf = arr[i].profit;
        int l = binarySearch(arr, i);
        if (l != -1)
            inclProf += table[l];

        // Store maximum of including and excluding
        table[i] = max(inclProf, table[i-1]);
    }

    // Store result and free dynamic memory allocated for table[]
    int result = table[n-1];
    free(table);

    return result;
}

int main()
{
    struct rent arr1[] = {{3, 10, 20}, {1, 2, 50}, {6, 19, 100}, {2, 100, 200}};
    int n = sizeof(arr1)/sizeof(arr1[0]);
    printf("\nOptimal profit is %d\n", findMaxProfit(arr1, n));
    return 0;
}

预期结果是250。经过进一步的研究,我发现C中的qsort()有不同的实现wrt。sort(),这是incsort。但我不确定这是唯一的原因还是什么。谁能告诉我哪里可能失礼。

最佳答案

C和C++中的“函子”工作方式不同。qsortbsearch需要返回小于、等于或大于0的值(如果s1小于、等于或大于s2)。
在C++中,函子只执行这些操作之一,例如返回true,如果较小,否则为false。
将代码更改为return s1.endtime - s2.endtime;
此外,你打电话给qsort也是胡说八道。正如在另一个答案中指出的,您给出的参数是错误的。sizeof(arr+n)应该是nqsort需要项目数,而不是字节数。而且您使用的sizeof不正确-您甚至不能在arris这样的函数参数上使用它。

关于c - 使用C的加权非重叠作业调度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43677884/

10-10 18:23
查看更多