有n个重量分别为w={w_1,w_2,…,w_n}的物品,他们的价值分别为v={v_1,v_2,…,v_n},给定一个容量为V的背包。 设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,并且背包内物品的总价值达到最大。
输入格式 第一行输入两个整数n、G,其中n表示物品的数量,G表示背包的容量体积。 第二行输入n个整数,整数间以空格分隔,表示n个物品的重量w_i 第三行输入n个整数,整数间以空格分隔,表示n个物品的价值v_i
输出格式 一个实数,表示能携带物品的最大价值。
输入样例 5 13 3 4 4 5 10 2 9 9 10 24
输出样例 28
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, c;
scanf("%d %d", &n, &c);
int* weight = (int*)malloc((n + 1) * sizeof(int));
int* value = (int*)malloc((n + 1) * sizeof(int));
weight[0] = 0;
for (int i = 1; i <= n; i++) {
scanf("%d", &weight[i]);
}
value[0] = 0;
for (int i = 1; i <= n; i++) {
scanf("%d", &value[i]);
}
int** v = (int**)malloc((n + 1) * sizeof(int*));
for (int i = 0; i <= n; i++) {
v[i] = (int*)malloc((c + 1) * sizeof(int));
}
for (int i = 0; i <= n; i++) {
v[i][0] = 0;
}
for (int j = 0; j <= c; j++) {
v[0][j] = 0;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= c; j++) {
if (j < weight[i]) {
v[i][j] = v[i - 1][j];
} else {
v[i][j] = (v[i - 1][j] > v[i - 1][j - weight[i]] + value[i]) ? v[i - 1][j] : v[i - 1][j - weight[i]] + value[i];
}
}
}
printf("%d\n", v[n][c]);
return 0;
}
5 13
3 4 4 5 10
2 9 9 10 24