/*题目描述
背包限定体积为t(<0t<10000给出n(1<n<100)个物品(可分割),选择物品装入背包中,使背包价值总和最大),
输入
K
n t
接下来n行每个物品的价值w,和体积v(0<w,v<1000)
输出
最大的价值(结果保留两位小数)
样例输入
1
2 7
6 7
7 7
样例输出
7.00
*/ //这一题没有给每个物品的单位重量的价值
#include<stdio.h>
#include<stdlib.h>
struct node
{
int w;
int v;
double l;
}s[110];
int com(const void *a,const void *b)
{
struct node *aa=(node *)a;
struct node *bb=(node *)b;
if(aa->l>bb->l)//从大到小排列
return -1;
else
return 1;
}
int main(void)
{
int k,n,t,i;
scanf("%d",&k);
while(k--)
{
scanf("%d %d",&n,&t);
for(i=0;i<n;i++)
{
scanf("%d %d",&s[i].w,&s[i].v);
s[i].l=s[i].w/s[i].v;
}
qsort(s,n,sizeof(s[0]),com);
double sum=0.0;
for(i=0;i<n;i++)
{
if(t-s[i].v>=0)
{
t=t-s[i].v;
sum=sum+s[i].w;
}
else
{
sum=sum+s[i].l*(s[i].v-t);
break;
}
}
printf("%.2lf\n",sum);
}
return 0;
}
简单的背包问题
最新推荐文章于 2023-04-21 16:58:11 发布