c语言01背包问题代码
时间: 2024-11-05 15:11:48 浏览: 23
在C语言中,解决0-1背包问题通常会使用动态规划算法。以下是使用二维数组表示状态并遍历所有可能组合的一种基本实现:
```c
#include <stdio.h>
// 定义背包问题的状态转移方程
int knapsack(int W, int wt[], int val[], int n) {
int K[n + 1][W + 1]; // 用于存放最优解
// 初始化矩阵K的第一行和第一列
for(int i = 0; i <= n; i++) {
K[i][0] = 0; // 重量为0时,价值总是0
}
for(int w = 0; w <= W; w++) {
K[0][w] = 0; // 物品为0时,无论背包有多重都拿不了东西
}
// 填充矩阵K
for(int i = 1; i <= n; i++) {
for(int w = 1; w <= W; w++) {
if(wt[i - 1] > w) { // 如果当前物品太重放不下
K[i][w] = K[i - 1][w]; // 则不选当前物品
} else { // 否则,选择与否取决于当前物品的价值和剩余容量
K[i][w] = max(val[i - 1] + K[i - 1][w - wt[i - 1]], K[i - 1][w]); // 取二者最大值
}
}
}
return K[n][W]; // 返回总价值
}
int main() {
int W = 50; // 背包的最大容量
int wt[] = {10, 20, 30}; // 物品的重量
int val[] = {60, 100, 120}; // 物品的价值
int n = sizeof(wt)/sizeof(wt[0]);
printf("最大价值为: %d\n", knapsack(W, wt, val, n));
return 0;
}
```
在这个代码中,`knapsack`函数接受背包容量、物品重量数组、物品价值数组和物品数量作为输入,返回能装入背包的最大价值。这个算法的时间复杂度是O(nW),其中n是物品数量,W是背包容量。
阅读全文