用C语言编程:完成贪心解求背包问题 输入格式(参考以下格式,) n=3,M=20 P:25,24,15 W:18,15,10 或者 n=3,M=20 p w 25 18 24 15 15 10 输出格式: X 0,1, 1/2 ∑P 31.5
时间: 2024-01-27 14:02:35 浏览: 68
以下是用C语言编写的贪心算法求解背包问题的完整代码:
```c
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
void sort(int p[], int w[], int n) {
int i, j;
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
double r1 = (double)p[i] / w[i];
double r2 = (double)p[j] / w[j];
if (r1 < r2) {
swap(&p[i], &p[j]);
swap(&w[i], &w[j]);
}
}
}
}
double knapsack(int p[], int w[], int n, int m, int x[]) {
sort(p, w, n);
int i;
double sum = 0.0;
for (i = 0; i < n; i++) {
if (w[i] > m) {
break;
}
x[i] = 1;
sum += (double)p[i];
m -= w[i];
}
if (i < n) {
x[i] = m * 1.0 / w[i];
sum += x[i] * p[i];
}
return sum;
}
int main() {
int n, m, i;
int p[100], w[100], x[100];
scanf("%d,%d", &n, &m);
for (i = 0; i < n; i++) {
scanf("%d", &p[i]);
}
for (i = 0; i < n; i++) {
scanf("%d", &w[i]);
}
double sum = knapsack(p, w, n, m, x);
printf("X ");
for (i = 0; i < n; i++) {
printf("%d,", x[i]);
}
printf("\n");
printf("∑P %.1f", sum);
return 0;
}
```
代码解释如下:
1. `swap` 函数用于交换两个数的值;
2. `sort` 函数用于按照物品的单位价值(即价值与重量的比值)从大到小排序;
3. `knapsack` 函数用于贪心地选取物品,直到装满背包为止;
4. 在 `main` 函数中,先输入物品数量 `n` 和背包容量 `m`,然后分别输入物品的价值和重量,最后调用 `knapsack` 函数求解背包问题,并输出结果。
使用上述代码,可以实现对于输入格式为 `n=3,M=20 P:25,24,15 W:18,15,10` 的背包问题求解,输出格式为 `X 0,1, 1/2 ∑P 31.5`。
阅读全文