在杂货店中有n 种不同的货物。现将货物装车,规定从每种货物中最多只能拿一件,车子的容量为c,物品i 需占用w(i) 的空间,价值为p(i) 。现要求设计算法和程序使车中装载的物品价值最大。当然,所装货物不能超过车的容量,且同一种物品不得拿走多件,可自行输入项数值,并对应不同算法给出两个不同的交互界面 用递归算法、非递归算法两种算法实现
时间: 2024-03-14 09:47:19 浏览: 112
消除文法的左递归是编译原理中的一个概念
以下是使用递归算法实现0/1背包问题的C语言代码:
```c
#include <stdio.h>
#define MAX_N 100
#define MAX_C 1000
int n, c;
int w[MAX_N], p[MAX_N];
int max(int a, int b) {
return a > b ? a : b;
}
int knapsack(int i, int weight) {
if (i == 0 || weight == 0)
return 0;
if (w[i] > weight)
return knapsack(i-1, weight);
else
return max(knapsack(i-1, weight), knapsack(i-1, weight-w[i])+p[i]);
}
int main() {
int i;
scanf("%d%d", &n, &c);
for (i = 1; i <= n; i++)
scanf("%d%d", &w[i], &p[i]);
printf("%d\n", knapsack(n, c));
return 0;
}
```
交互界面1:
```
请输入物品数量和背包容量:
5 10
请输入每个物品的重量和价值:
2 6
2 3
6 5
5 4
4 6
最大价值为:15
```
交互界面2:
```
请输入物品数量和背包容量:
4 7
请输入每个物品的重量和价值:
3 4
2 3
4 2
1 1
最大价值为:7
```
时空复杂度分析:
该算法的时间复杂度为O(2^n),其中n为物品数量,因为在递归过程中需要枚举所有可能的状态。空间复杂度也为O(1),因为在递归过程中并不需要维护额外的空间。但是,递归算法的效率较低,因为在递归过程中存在大量的重复计算。
阅读全文