对该段代码进行完善#include <stdio.h> #include <stdlib.h> typedef struct { int id; double v; } Node; int cmp(const void *a, const void *b) { Node *pa = (Node *)a; Node *pb = (Node *)b; return pb->v > pa->v ? 1 : -1; } int main() { int n, c, i, j, k; double w[1005], v[1005], f[1005][1000005]; Node nodes[1005]; // 读入数据 scanf("%d%d", &n, &c); for (i = 1; i <= n; ++i) { scanf("%lf%lf", &w[i], &v[i]); nodes[i].id = i; nodes[i].v = v[i] / w[i]; } // 按单位重量价值降序排序 qsort(nodes + 1, n, sizeof(Node), cmp); // 动态规划过程 for (i = 1; i <= n; ++i) { for (j = 0; j <= c; ++j) { if (j < w[nodes[i].id]) { f[i][j] = f[i - 1][j]; } else { f[i][j] = f[i - 1][j] > f[i - 1][j - w[nodes[i].id]] + v[nodes[i].id] ? f[i - 1][j] : f[i - 1][j - w[nodes[i].id]] + v[nodes[i].id]; } } } // 输出结果 for (i = 1; i <= n; ++i) { printf("%d: %d\n", nodes[i].id, f[i][c] > f[i - 1][c] ? 1 : 0); } return 0; }
时间: 2024-03-16 15:45:50 浏览: 69
C语言头文件 LIST.H
这段代码实现的是背包问题的解法,但是有一些可以完善的地方:
1. 在读入数据时,可以对重量和价值都为0的物品进行过滤,因为这些物品对背包问题没有任何贡献。
2. 在动态规划过程中,可以使用滚动数组来降低空间复杂度,因为每次计算 f[i][j] 只需要用到 f[i-1][j] 和 f[i-1][j-w[nodes[i].id]]。
下面是完善后的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int id;
double v;
} Node;
int cmp(const void *a, const void *b) {
Node *pa = (Node *)a;
Node *pb = (Node *)b;
return pb->v > pa->v ? 1 : -1;
}
int main() {
int n, c, i, j, k;
double w[1005], v[1005], f[2][1000005];
Node nodes[1005];
// 读入数据
scanf("%d%d", &n, &c);
for (i = 1; i <= n; ++i) {
scanf("%lf%lf", &w[i], &v[i]);
if (w[i] == 0 && v[i] == 0) {
n--;
i--;
continue;
}
nodes[i].id = i;
nodes[i].v = v[i] / w[i];
}
// 按单位重量价值降序排序
qsort(nodes + 1, n, sizeof(Node), cmp);
// 动态规划过程
for (i = 1; i <= n; ++i) {
for (j = 0; j <= c; ++j) {
if (j < w[nodes[i].id]) {
f[i % 2][j] = f[(i - 1) % 2][j];
} else {
f[i % 2][j] = f[(i - 1) % 2][j] > f[(i - 1) % 2][j - w[nodes[i].id]] + v[nodes[i].id] ?
f[(i - 1) % 2][j] : f[(i - 1) % 2][j - w[nodes[i].id]] + v[nodes[i].id];
}
}
}
// 输出结果
for (i = 1; i <= n; ++i) {
printf("%d: %d\n", nodes[i].id, f[i % 2][c] > f[(i - 1) % 2][c] ? 1 : 0);
}
return 0;
}
```
阅读全文