这是一道类背包问题的贪心算法题,代码写的不是很干练,学习中,一起进步了。
import java.util.Scanner;
//类背包问题
public class Hd1009 {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int m=sc.nextInt();
int n=sc.nextInt();
if(m==-1&&n==-1) break;
double [] j=new double[n]; //记录豆子
double [] f=new double[n]; //记录猫食
for(int i=0;i<n;i++){
j[i]=sc.nextInt();
f[i]=sc.nextInt();
}
//求交换比
double[] bi=new double[n];
for(int i=0;i<n;i++){
bi[i]=j[i]/f[i];
}
qSort(bi,j,f,0,bi.length-1);
// for(int i=0;i<n;i++){
// System.out.println(bi[i]);
// }
double sum=0; //记录胖老鼠的交易量
int k;
for(k=0;k<n;k++){
if(f[k]>m) break;
else{
sum+=j[k];
m-=f[k];
}
}
if(k<n){
sum+=j[k]*(m/f[k]);
}
System.out.printf("%.3f",sum).println();
}
}
//按交换比排序
private static void qSort(double []bi,double []j,double[]f,int p,int r){
if(p<r){
int q=partition(bi,j,f,p,r);
qSort(bi,j,f,p,q-1);
qSort(bi,j,f,q+1,r);
}
}
private static int partition(double [] a,double []b,double[]c,int p,int r){
int i=p;
int j=r+1;
double x=a[p];
while(true){
while(a[++i]>x&&i<r);
while(a[--j]<x);
if(i>=j) break;
double temp=a[i];
a[i]=a[j];
a[j]=temp;
temp=b[i];
b[i]=b[j];
b[j]=temp;
temp=c[i];
c[i]=c[j];
c[j]=temp;
}
double temp1=b[j];
b[j]=b[p];
b[p]=temp1;
temp1=c[j];
c[j]=c[p];
c[p]=temp1;
a[p]=a[j];
a[j]=x;
return j;
}
}