逐行解释该代码:#include <stdio.h> #include <stdlib.h> typedef struct { int d; // 截止期限 int p; // 效益 } Job; int cmp(const void *a, const void *b) { return ((Job *)b)->p - ((Job *)a)->p; // 按效益从大到小排序 } int main() { int n, i, j, max_d = 0, max_p = 0; scanf("%d", &n); Job *jobs = (Job *)malloc(n * sizeof(Job)); // 存储作业的数组 for (i = 0; i < n; i++) { scanf("%d %d", &jobs[i].d, &jobs[i].p); if (jobs[i].d > max_d) max_d = jobs[i].d; // 找到最大的截止期限 if (jobs[i].p > max_p) max_p = jobs[i].p; // 找到最大的效益 } qsort(jobs, n, sizeof(Job), cmp); // 按效益从大到小排序 int *set = (int *)calloc(max_d, sizeof(int)); // 集合树,用于判断作业的截止期限是否冲突 int sum_p = 0, num_jobs = 0; // sum_p表示最大效益值,num_jobs表示最优解J中作业的个数 for (i = 0; i < n; i++) { for (j = jobs[i].d-1; j >= 0; j--) { // 从后往前查找集合树,找到空闲的时间插入作业 if (!set[j]) { set[j] = jobs[i].p; // 将作业插入集合树 sum_p += jobs[i].p; // 更新最大效益值 num_jobs++; // 更新最优解J中作业的个数 break; } } } printf("%d\n", sum_p); // 输出最大效益值 for (i = 0; i < max_d; i++) { if (set[i]) printf("%d ", set[i]); // 输出最优解J中的作业 } printf("\n"); free(jobs); free(set); return 0; }
时间: 2024-04-27 09:21:40 浏览: 74
这是一个用于解决“Job Sequencing with Deadlines”问题的 C 语言程序。该问题是一个经典的贪心算法问题,假设有 n 个作业,每个作业有一个截止期限和一个效益值。每个作业需要在截止期限之前完成,否则就无法获得效益值。目标是找到一个最优解 J,使得 J 中的作业个数最大,且能够获得最大的效益值。
程序中的主要逻辑如下:
首先定义了一个结构体 Job,用于存储每个作业的截止期限和效益值。然后定义了一个用于比较两个作业效益值大小的比较函数 cmp,该函数用于在排序时按效益从大到小排序。
在主函数中,首先读入 n,然后动态分配一个 Job 数组 jobs 用于存储所有的作业。在读入每个作业的截止期限和效益值之后,程序找到了数组中的最大截止期限和最大效益值 max_d 和 max_p。接着将 jobs 数组按效益从大到小排序,并动态分配一个大小为 max_d 的集合树 set,用于判断作业的截止期限是否冲突。
接下来程序用贪心算法的思想,从效益最大的作业开始遍历,如果当前作业的截止期限在集合树中还有空闲的时间,则将其加入集合树中,并更新最大效益值和最优解 J 中作业的个数。最后输出最大效益值和最优解 J 中的作业即可。程序在最后释放了动态分配的数组和集合树。
总体来说,这个程序比较简单,主要是在贪心算法的思想上进行实现。
相关问题
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef int ElemType; typedef struct
这段代码是C语言中的头文件引用和一些定义的示例。其中,`#include <stdio.h>`和`#include <stdlib.h>`是用来引入标准库函数的头文件。`stdio.h`包含了输入输出相关的函数,如`printf`和`scanf`;`stdlib.h`包含了一些常用的函数,如内存分配函数`malloc`和随机数生成函数`rand`。
`#define MAXSIZE 100`是一个宏定义,用来定义一个常量`MAXSIZE`,它的值为100。
`typedef int ElemType;`是用来给`int`类型起一个别名`ElemType`,方便在代码中使用。
至于代码中的结构体部分,由于你没有提供完整的代码,所以无法给出具体的解释。但一般来说,结构体用于定义一种自定义的数据类型,可以包含多个不同类型的成员变量。
# include < stdio. h> # include < stdlib. h> typedef int ElemType; typedef struct LNode { ElemType
这是一个C语言程序中的部分代码,涉及到头文件的包含和数据结构的声明。`#include <stdio.h>` 和 `#include <stdlib.h>` 是用来引入标准输入输出库以及标准库函数,如内存管理和I/O操作。
`typedef int ElemType;` 定义了一个新的类型别名 `ElemType`,通常在数据结构中用于元素类型,例如链表中的节点元素。
接着,`typedef struct LNode` 开始定义一个名为 `LNode` 的结构体,这通常是用来表示链表的节点。在链表中,每个节点一般包含两个部分:一个是存储数据的域(`ElemType data;`,这个部分会被 `ElemType` 替换),另一个可能是指向下一个节点的指针(`struct LNode* next;`)。完整的结构体可能会像这样:
```c
typedef int ElemType;
typedef struct LNode {
ElemType data; // 节点的数据域
struct LNode* next; // 指向下一个节点的指针
} LNode;
```
阅读全文