背包最大限重25kg,物品重量分别是2,3,9,6,7,价值分别16,25,18,20,13用性价比写出算法C语言实现
时间: 2024-09-30 18:11:24 浏览: 23
为了解决背包问题(0-1 Knapsack Problem),我们可以使用动态规划算法。在这种情况下,我们想要选择物品使得总价值最大,同时不超过给定的背包最大限重。性价比是指物品的价值与其重量的比例,这里我们将使用这个比例作为选择物品的一个依据。以下是使用C语言实现的简单版本:
```c
#include <stdio.h>
// 定义物品结构体
typedef struct {
int weight; // 物品重量
int value; // 物品价值
} Item;
// 比较性价比
int compare_ratio(Item a, Item b) {
return (double)a.value / a.weight > (double)b.value / b.weight;
}
// 动态规划函数
int knapSack(int W, Item items[], int n) {
int dp[n + 1][W + 1]; // 创建二维数组用于存储结果
// 遍历所有物品和背包容量范围
for (int i = 0; i <= n; i++) {
for (int w = 0; w <= W; w++) {
// 如果背包为空或者物品不存在,直接返回0
if (i == 0 || w == 0)
dp[i][w] = 0;
else if (items[i - 1].weight <= w) // 当物品能装下
dp[i][w] = max(items[i - 1].value + dp[i - 1][w - items[i - 1].weight], dp[i - 1][w]); // 取当前物品加入和不加入的最大值
else // 物品太重,无法装入
dp[i][w] = dp[i - 1][w];
}
}
return dp[n][W]; // 返回背包所能达到的最大价值
}
int main() {
int W = 25; // 背包最大限重
Item items[] = { {2, 16}, {3, 25}, {9, 18}, {6, 20}, {7, 13} }; // 物品列表
int n = sizeof(items) / sizeof(items[0]);
// 对物品按性价比降序排序
qsort(items, n, sizeof(Item), compare_ratio);
printf("背包内物品的最大价值为:%d\n", knapSack(W, items, n));
return 0;
}
```
在这个代码中,首先计算物品的性价比并排序,然后通过动态规划寻找最优解。注意这是一个简化的版本,实际应用中可能需要处理更复杂的情况,如有负价值的物品。
阅读全文