用c语言程序编写以下题目 给定n种物品(每种仅一个)和一个容量为c的背包,要求选择物品装入背包,使得装入背包中物品的总价值最大。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据输入3行,第1行为两个整数n(1≤n≤400)和c (1≤c≤1500),分别表示物品数量与背包容量,第二行为n个物品的重量w i (1≤i≤n),第三行为这n个物品的价值v i (1≤i≤n)。物品重量、价值都为整数。 输出格式: 对于每组测试,在一行上输出一个整数,表示装入背包的最大总价值(结果保证在2 31 −1范围内)。
时间: 2024-02-09 17:07:55 浏览: 113
0-1背包问题.java给定背包的容量c,物品数量n、物品重量的集合w[n]和物品价值的集合v[n]; 2... 设有n种物品,
5星 · 资源好评率100%
以下是用 C 语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max(a,b) ((a)>(b)?(a):(b))
int main()
{
int n, c;
int w[401], v[401];
int dp[1501];
while (scanf("%d %d", &n, &c) != EOF) {
memset(dp, 0, sizeof(dp)); // 初始化 dp 数组
for (int i = 1; i <= n; i++) {
scanf("%d", &w[i]);
}
for (int i = 1; i <= n; i++) {
scanf("%d", &v[i]);
}
for (int i = 1; i <= n; i++) {
for (int j = c; j >= w[i]; j--) {
dp[j] = max(dp[j], dp[j-w[i]]+v[i]); // 状态转移方程
}
}
printf("%d\n", dp[c]);
}
return 0;
}
```
代码中使用了一个宏定义 max(a,b) 来求两个数的最大值,可以替换成 if 语句的形式。在每组测试数据开始时,需要将 dp 数组初始化为 0。接着,读入重量和价值数组,然后使用两个嵌套的循环计算 dp 数组,最后输出 dp[c] 的值。
阅读全文