各位大佬,费心再来看看吧,上传结果又WA了。。。。。。
问题描述小鱼儿在一次探险途中发现了一个山洞,并且在这个山洞里找到了宝藏,可是小鱼儿发现想要把宝藏全部带走是不可能的(因为他只带了一个袋子),不过很快他就发现每个宝物旁边都有几个字,上面写着宝物的体积和价值,而且这些宝物可以分割成任意大小。小鱼儿想知道如何选取宝物,才能使带走宝物的价值最大。
输入
第一行有两个整数v和n,表示袋子的容量和宝物的数量。(0<n<=100,0<v<=10000)
接下来n行每行两个整数,分别表示宝物的体积和价值。
输出
在单独的一行中输出一个数,表示能够带走宝物的最大价值,结果保留两位小数。
输入样列
10 3
10 30
11 55
4 30
输出样例
60.00
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
int main()
{
int a[100],b[100];
double c[100],d[100],sum=0;
int i,j,w,n;
scanf("%d %d",&w,&n);
for(i=0;i<n;i++)
{
scanf("%d %d",&a[i],&b[i]);
c[i]=b[i]/(a[i]*1.0);
d[i]=c[i];
}
sort(d,d+n-1);
for(i=n-1;i>=0;i--){
for(j=0;j<n;j++){
if(c[j]==d[i]&&w>0){
if(w>=a[j])
sum+=b[j];
else
sum+=c[j]*w;
w=w-a[j];
}
}
}
printf("%.2lf\n",sum);
}