关于货郎担(Knapsack Problem)问题,请提供一个C语言实现的详细代码示例及解释,包括如何定义问题、选择算法和关键步骤。
时间: 2024-11-22 16:36:07 浏览: 78
货郎担问题(0-1 Knapsack Problem),也称为背包问题,是一个经典的优化问题,目标是在给定物品重量和价值的情况下,找到一种组合,使得物品的总重量不超过背包的容量,并且总价值最大。这里是一个简单的C语言实现,使用动态规划法解决。
```c
#include <stdio.h>
// 定义物品结构体
typedef struct {
int weight; // 物品重量
int value; // 物品价值
} Item;
// 动态规划函数
int knapSack(int W, Item arr[], int n) {
int i, w;
int dp[n+1][W+1];
// 初始化二维数组
for (i = 0; i <= n; i++) {
for (w = 0; w <= W; w++) {
if (i == 0 || w == 0)
dp[i][w] = 0;
else if (arr[i-1].weight <= w)
dp[i][w] = max(arr[i-1].value + dp[i-1][w-arr[i-1].weight], dp[i-1][w]);
else
dp[i][w] = dp[i-1][w];
}
}
return dp[n][W];
}
// 主函数测试
int main() {
int W = 50; // 背包容量
Item items[] = { // 一些物品样本
{10, 60},
{20, 100},
{30, 120},
{40, 120}
};
int n = sizeof(items) / sizeof(items[0]);
printf("最大价值: %d\n", knapSack(W, items, n));
return 0;
}
```
**解释:**
1. `knapSack` 函数接收背包容量 `W`,物品数组 `arr` 和物品数量 `n` 作为输入。
2. 使用二维数组 `dp` 存储状态,`dp[i][w]` 表示前 `i` 个物品中选取总重量不超过 `w` 的物品的最大价值。
3. 当物品为空(`i==0`)或背包容量为零(`w==0`)时,显然无法装入物品,所以价值为零。
4. 如果当前物品可以放入背包(`arr[i-1].weight <= w`),则有两种选择:选择这个物品(`arr[i-1].value + dp[i-1][w-arr[i-1].weight]`)或不选它(`dp[i-1][w]`)。取两者较大值。
5. 如果当前物品不能放入背包(`arr[i-1].weight > w`),就只能考虑前面的物品(`dp[i-1][w]`)。
6. 最后返回 `dp[n][W]`,即所有物品中选取最大价值。
阅读全文