使用C语言实现代码:现有n种物品,对1<=i<=n,第i种物品的重量为正整数w i ,价值为正整数p i ,背包能承受的最大载重量为正整数M,要求找出这n种物品的一个子集,使得子集中物品的总重量不超过M且总价值尽量大。0/1背包问题要求物品或者整件装入背包中,或者根本不装入(即不能装入物品的一部分),所以x i 限定只能取值0或1。 输入格式: 第1行是M和n,表示背包容量为M且有n件物品; 第2行是这n件物品的重量w i ; 第3行是各物品的价值p i ,背包容量和物品重量都为整数。 输出格式: 第1行是所选物品的价值之和,以及重量之和; 第2行是各物品装入背包的量,即x i 值。 输入样例1: 6 3 2 3 4 1 2 5 输出样例1: 6 6 1 0 1
时间: 2024-02-23 21:59:46 浏览: 43
0-1背包问题的c语言实现
以下是使用动态规划实现 0/1 背包问题的 C 语言代码:
```c
#include <stdio.h>
#define MAX_N 1000
#define MAX_M 1000
int w[MAX_N], p[MAX_N]; // 物品的重量和价值
int f[MAX_N][MAX_M]; // f(i,j) 表示前 i 件物品放入容量为 j 的背包中所得到的最大价值
int x[MAX_N]; // x(i) 表示第 i 件物品是否放入背包中,0 表示不放,1 表示放
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
int n, m;
scanf("%d%d", &m, &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &w[i]);
}
for (int i = 1; i <= n; ++i) {
scanf("%d", &p[i]);
}
for (int i = 1; i <= n; ++i) {
for (int j = 0; j <= m; ++j) {
if (j < w[i]) {
f[i][j] = f[i - 1][j];
} else {
f[i][j] = max(f[i - 1][j], f[i - 1][j - w[i]] + p[i]);
}
}
}
int ans_p = f[n][m], ans_w = 0;
int j = m;
for (int i = n; i >= 1; --i) {
if (f[i][j] > f[i - 1][j]) {
x[i] = 1;
ans_w += w[i];
j -= w[i];
}
}
printf("%d %d\n", ans_p, ans_w);
for (int i = 1; i <= n; ++i) {
printf("%d ", x[i]);
}
printf("\n");
return 0;
}
```
输入样例:
```
6 3
2 3 4
1 2 5
```
输出样例:
```
6 6
1 0 1
```
阅读全文