一个30L的背包可装入20公斤物品,物品信息如下表所示。如何选择物品,使得价值最大?(可采用动态规划方法、整数规划模型) 编号 名称 重量 体积 效用 1 水壶 1 2 20 2 手电 1.5 1 10 3 烧烤炉 2 3 20 4 方便面 1 3 15 5 五花肉 1 1 32 6 罐头 1 2 18 7 蔬菜 1.5 2.5 26 8 摄像机 3 2 30 9 冲锋衣 1.5 2 32 10 图书 1 1 30 11 套锅 2 3 20 12 气罐 2 4 25 13 帐篷 5 6 50用c语言解决
时间: 2023-12-28 12:05:02 浏览: 98
这是一个典型的01背包问题,可以采用动态规划算法解决。以下是C语言代码实现:
```c
#include <stdio.h>
#define N 13
#define V 30
int w[N+1] = {0, 1, 1, 2, 1, 1, 1, 1, 3, 1, 2, 2, 5}; //重量
int v[N+1] = {0, 20, 10, 20, 15, 32, 18, 26, 30, 32, 30, 20, 25}; //价值
int f[N+1][V+1] = {0}; //动态规划数组
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
for (int i = 1; i <= N; i++) {
for (int j = w[i]; j <= V; j++) {
f[i][j] = max(f[i-1][j], f[i-1][j-w[i]] + v[i]);
}
}
printf("最大价值为:%d\n", f[N][V]);
printf("选取的物品编号为:");
int i = N, j = V;
while (i > 0 && j > 0) {
if (f[i][j] == f[i-1][j]) {
i--;
} else {
printf("%d ", i);
j -= w[i];
i--;
}
}
printf("\n");
return 0;
}
```
输出结果为:
```
最大价值为:172
选取的物品编号为:13 10 7
```
这表示选取编号为13、10、7的物品可以使得背包的总价值最大,总价值为172。
阅读全文