阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有 N(N≤100) 堆金币,第i堆金币的总重量和总价值分别是mi,vi(1≤mi,vi≤1000)阿里巴巴有一个承重量为T(T≤1000)的背包,但并不一定有办法将全部的金币都装进去。他想装走尽可能多价值的金币。所有金币都可以随意分割,分割完的金币重量价值比(也就是单位价格)不变。请问阿里巴巴最多可以拿走多少价值的金币? 输入格式 第一行两个整数 N,T。 接下来N行,每行两个整数 mi,vi 输出格式 一个实数表示答案,输出两位小数 样例 输入 4 50 10 60 20 100 30 120 15 45 输出 240.00
#include<stdio.h>
void swap_int (int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
void swap_double (double *a,double *b)
{
double t;
t=*a;
*a=*b;
*b=t;
}
int main()
{
int n,t;
scanf("%d%d",&n,&t);
int i,j,m[1000]={},v[1000]={};
double c[1000]={};
for(i=0;i<n;i++)
{
scanf("%d%d",&m[i],&v[i]);
c[i]=v[i]*1.0/(m[i]*1.0);
}
for(i=1;i<n;i++)
for(j=0;j<n-i+1;j++)
if(c[j]<c[j+1])
{
swap_int(&m[j],&m[j+1]);
swap_int(&v[j],&v[j+1]);
swap_double(&c[j],&c[j+1]);
}
double ans=0;
for(i=0;i<n;i++)
{
if(m[i]<t)
{
ans+=1.0*v[i];
t-=m[i];
}
else
{
ans+=t*c[i];
break;
}
}
printf("%.2f",ans);
}
?
|