问题描述
“嘟嘟嘟嘟嘟嘟
喇叭响
我是汽车小司机
我是小司机
我为祖国运输忙
运输忙”
这是儿歌“快乐的小司机”。话说现在当司机光有红心不行,还要多拉快跑。多拉不是超载,是要让所载货物价值最大,特别是在当前油价日新月异的时候。司机所拉货物为散货,如大米、面粉、沙石、泥土……
现在知道了汽车核载重量为w,可供选择的物品的数量n。每个物品的重量为gi,价值为pi。求汽车可装载的最大价值。(n<10000,w<10000,0
import java.math.BigDecimal;
import java.util.Scanner;
/**
* @author 翔
*
*/
public class Main {
private static int n;
private static int w;
private static int[] weightArr;
private static int[] valueArr;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
w=sc.nextInt();
weightArr=new int[n];
valueArr=new int[n];
for(int i=0;i<n;i++){
weightArr[i]=sc.nextInt();
valueArr[i]=sc.nextInt();
}
quickSort(0,n-1);
int index=0;
double sum=0;
while(true){
if(w>=weightArr[index]){
w-=weightArr[index];
sum+=valueArr[index];
}else{
sum+=valueArr[index]*w*1.0/weightArr[index];
w=0;
}
index++;
if(w==0||index==n){
break;
}
}
System.out.println(new BigDecimal(sum).divide(BigDecimal.ONE, 1, BigDecimal.ROUND_HALF_UP));
}
private static void quickSort(int p,int r){
if(p<r){
int q=partition(p,r);
quickSort(p,q-1);
quickSort(q+1,r);
}
}
private static int partition(int p,int r){
int i=p;
int j=r+1;
double x=valueArr[p]*1.0/weightArr[p];
while(true){
while(valueArr[++i]*1.0/weightArr[i]-x>0&&i<r);
while(valueArr[--j]*1.0/weightArr[j]-x<0);
if(i>=j){
break;
}
int temp=weightArr[i];
weightArr[i]=weightArr[j];
weightArr[j]=temp;
temp=valueArr[i];
valueArr[i]=valueArr[j];
valueArr[j]=temp;
}
int temp=weightArr[p];
weightArr[p]=weightArr[j];
weightArr[j]=temp;
temp=valueArr[p];
valueArr[p]=valueArr[j];
valueArr[j]=temp;
return j;
}
}