六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 39|回复: 0

c语言0-1背包问题

[复制链接]

升级  28%

26

主题

26

主题

26

主题

秀才

Rank: 2

积分
92
 楼主| 发表于 2013-1-26 12:44:08 | 显示全部楼层 |阅读模式
给定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 410typedef struct{int wi;int vi;}Goods;Goods goods[MAXN];//算法思路:贪心算法,每次都向背包里面装入价值最大的物品,如果装入超过容量cint 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;}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表