c语言0-1背包有关问题
c语言0-1背包问题
给定n种物品和1个背包,物品i的重量是wi,其价值为vi,背包的容量为C。要求选择装入背包的物品,使得装入背包中物品的总价值最大。
Input
每组测试数据包含3行,第1行为n和c,表示有n(0<=n<=400)个物品且背包容量为c (c<=1500),第二行为这n个物品的重量wi(1<=wi<=1000),第三行为这n个物品的价值vi。背包容量和物品重量都为整数。
Output
输出装入背包的最大总价值,每个答案一行。
Sample Input
5 10
2 2 6 5 4
6 3 5 4 6
Sample Output
15
代码:
给定n种物品和1个背包,物品i的重量是wi,其价值为vi,背包的容量为C。要求选择装入背包的物品,使得装入背包中物品的总价值最大。
Input
每组测试数据包含3行,第1行为n和c,表示有n(0<=n<=400)个物品且背包容量为c (c<=1500),第二行为这n个物品的重量wi(1<=wi<=1000),第三行为这n个物品的价值vi。背包容量和物品重量都为整数。
Output
输出装入背包的最大总价值,每个答案一行。
Sample Input
5 10
2 2 6 5 4
6 3 5 4 6
Sample Output
15
代码:
#include <stdio.h> #include <stdlib.h> #define MAXN 410 typedef struct{ int wi; int vi; }Goods; Goods goods[MAXN]; //算法思路:贪心算法,每次都向背包里面装入价值最大的物品,如果装入超过容量c int cmp(const void *a, const void *b) { return (*(Goods*)a).vi - (*(Goods*)b).vi; } int main() { int n, c, i,sum = 0, total = 0; scanf("%d %d", &n, &c); for(i = 0; i < n; i++) { scanf("%d", &goods[i].wi); } for(i = 0; i < n; i++) { scanf("%d", &goods[i].vi); } qsort(goods, n, sizeof(Goods),cmp); for(i = n - 1; i >= 0; i--) { sum += goods[i].wi; if(sum <= c) { total += goods[i].vi; }else { sum -= goods[i].wi; } } printf("%d\n", total); return 0; }