用c语言程序的贪心算法写装箱问题
时间: 2023-10-02 07:05:37 浏览: 52
装箱问题可以简单描述为:有一批物品,它们的重量分别为w1, w2, w3, ..., wn,现在需要将它们装进k个装满重量的箱子中,尽可能地利用空间,求出每个箱子的最小重量。
贪心算法的思路是:每次将尽可能多的物品放进一个箱子中,直到不能再放为止。然后再将下一个箱子装满,直到所有物品都被装箱。
下面是用C语言编写的贪心算法代码:
```
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100
int cmp(const void *a, const void *b) {
return (*(int *)b - *(int *)a);
}
int main() {
int n, k, w[MAXN], sum = 0, ans = 0;
scanf("%d%d", &n, &k);
for (int i = 0; i < n; i++) {
scanf("%d", &w[i]);
sum += w[i];
}
qsort(w, n, sizeof(int), cmp);
int l = 0, r = sum;
while (l <= r) {
int mid = (l + r) >> 1;
int cnt = 0, cur = 0;
for (int i = 0; i < n; i++) {
if (cur + w[i] > mid) {
cnt++;
cur = w[i];
} else {
cur += w[i];
}
}
cnt++;
if (cnt <= k) {
r = mid - 1;
ans = mid;
} else {
l = mid + 1;
}
}
printf("%d\n", ans);
return 0;
}
```
其中,cmp函数是用于快速排序的比较函数,使物品按重量从大到小排序。主函数中,先读入物品数量n和箱子数量k,然后读入每个物品的重量并求出它们的总重量sum,再对物品按照重量从大到小排序。
接下来,使用二分查找来确定每个箱子的最小重量。在每次二分时,首先计算出当前mid下,使用最少箱子的方案。如果箱子数不超过k,则说明mid过大,需要继续缩小范围;否则,说明mid过小,需要增大范围。
最后输出ans即可得到每个箱子的最小重量。