c - 平衡工作负载分配?

标签 c algorithm distribution

我有 N 份工作,工作量各不相同,需要将其分配给 n 个人,以便工作量尽可能平衡。

例如-我们必须根据工作量划分 5 个工作 <1,2,3,4,5> 3人之间。最好的方法显然是按如下方式分发:-

<1,4>,<2,3>,<5>.

因此问题是最小化

z=abs(a-b)+abs(b-c)+abs(c-a)

哪里a , b , c是三个人的工作量。解决问题最有效的方法是什么?

最佳答案

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

int *insort(int *var, int elem)
{   // insert elem into sorted variable array var[1..n] (*var holds n)
    int n = var ? *var : 0;
    var = realloc(var, (1 + ++n) * sizeof *var);
    if (!var) exit(1);
    *var = n;
    int i;
    for (i = 1; i < n; ++i) if (elem < var[i]) break;
    memmove(var+i+1, var+i, (n-i) * sizeof *var);
    var[i] = elem;
    return var;
}

main()
{   // distribute jobs characterized by workloads among n persons
    int n, i, j, *jobs = NULL;
    printf("number of persons? "); scanf("%d", &n);
    printf("job workloads? ");
    while (scanf("%d", &i) > 0) jobs = insort(jobs, i);
    int *w, *work[n], load[n];
    for (i = 0; i < n; ++i) work[i] = NULL, load[i] = 0;
    if (n > 0 && jobs) do
    {   // assign the most strenuous job to the least busy person
        w = insort(work[0], j = jobs[(*jobs)--]);
        j += load[0];
        for (i = 1; i < n; ++i) if (load[i] > j) break;
        memmove(load, load+1, --i * sizeof *load), load[i] = j;
        memmove(work, work+1,   i * sizeof *work), work[i] = w;
    } while (*jobs);
    for (i = 0; i < n; ++i, puts(""))
        if (w = work[i]) do printf(" %d", w[(*w)--]); while (*w);
}

示例运行:

number of persons? 3
job workloads? 1 2 3 4 5.
 5
 3 2
 4 1

关于c - 平衡工作负载分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28649798/

相关文章:

c - 使用 jpegtran 旋转渐进式 jpeg : invalid SOS parameter for sequential jpeg

c++ - 获取 DLL 文件的外部命令

performance - 用 D 语言比较两个内存块的最有效方法是什么?

c - 查找数组中前 n 个最大的元素

Python3 - 在饥饿的狼之间分配口粮的最佳方式是什么?

c - 计算机上字符表示的底层细节

c - 获取一个字符串,并使用连字符分隔符解析/标记为更小的字符串

python - 计算两个文本 block 之间百分比差异的算法

javascript - 使用 Node.js 根据特定分布生成 1 到 100 之间的随机变量

python - 如何以有效的方式截断 numpy/scipy 指数分布?