标签:style http io color ar os 使用 for sp
1 3 15 5 10 2 8 3 9
65
解题思路:每个物品的属性有两个(单位重量的价值(特别注意下,单位重量的价值,不是总价值),和重量),所以用结构体进行存储,并使用相应的快速排序进行排序(贪心就排序),之后对排序完成的物品操作,不管物品的重量有没有超过背包的总容量,先放进背包,再进行判断是否超出容量,如果超出,则去掉超出部分所对应的价值:对应代码为:
price = price + goods[i].v * goods[i].w;
max = max + goods[i].w;
if(max > m){
price = price - (max - m) * goods[i].v;
break;
}下面给出完整代码:
#include<stdio.h>
#include<stdlib.h>
#define Max 15//最多能支持的物品的个数
struct good{
int v;//每个物品的单位重量的价值
int w;//每个物品的和总量
}goods[Max];
int com(const void *a,const void *b)//结构体快排比较函数
{
struct good *aa = (good*)a;
struct good *bb = (good*)b;
return (bb -> v) - aa -> v;
}
int main()
{
int m;//背包的最大容量m
int n,s;//n组测试数据,每组数据s个物品
int v,w;//单位重量的价值v,重量w
int i;
scanf("%d",&n);
while(n--)
{
int max=0,price=0;//max当前装入的重量,price当前装入的价值
scanf("%d%d",&s,&m);
for(i = 0; i < s; i ++)//去掉每一个物品的信息
scanf("%d%d",&goods[i].v,&goods[i].w);
qsort(goods,s,sizeof(goods[0]),com);//快速排序
for(i = 0; i < s; i ++)//对于每一个物品进行遍历
{
price = price + goods[i].v * goods[i].w;
max = max + goods[i].w;
if(max > m){//若max大于总容量,后面的物品就不再装了,对应代码的break
price = price - (max - m) * goods[i].v;
break;
}
}
printf("%d\n",price);
}
return 0;
}标签:style http io color ar os 使用 for sp
原文地址:http://blog.csdn.net/u012437355/article/details/40867131