某地举行装背包比赛,规定参赛者要往一只背包里装不同种类的物品,每种物品可以只装一部分。背包中装入物品的总价值最高者获胜。用C语言写代码
时间: 2024-11-22 09:39:13 浏览: 52
在C语言中解决这个背包问题,通常可以使用动态规划算法,例如0-1背包问题,即每个物品只能取一次。我们可以定义一个二维数组`dp[i][w]`,其中`i`表示物品索引,`w`表示背包当前能装载的最大重量。
下面是一个简单的思路:
```c
#include <stdio.h>
// 定义物品结构体
typedef struct {
int weight; // 物品重量
int value; // 物品价值
} Item;
// 动态规划函数
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++) {
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() {
Item items[] = {{60, 100}, {100, 200}, {120, 300}};
int n = sizeof(items) / sizeof(items[0]);
int W = 500;
printf("背包最大价值为: %d\n", knapsack(W, items, n));
return 0;
}
```
在这个例子中,`knapsack`函数计算了给定背包容量`W`和物品数组的情况下,背包能获得的最大价值。它遍历所有可能的物品组合,并根据是否放入当前物品更新状态。
阅读全文
相关推荐














