题目:n个物品,第i个物品重量wi,价值vi,放入装在能力为c的背包中,物品可只放一部分。求装载价值最大的装载方法。
package hello;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
String str=s.nextLine();
double max=s.nextInt(),carry=0,maxvalues=0;
String []s2=str.split(",");
1. //建立数组完毕
int [][]c=new int [(s2.length)/2][2];
for(int i=0;i<s2.length;i=i+2) {
c[i/2][0]=Integer.parseInt(s2[i]);
c[i/2][1]=Integer.parseInt(s2[i+1]);
}
double []a=new double[c.length];
for(int i=0;i<a.length;i++) {
a[i]=(double)c[i][0]/c[i][1];
}
2. //输出排序前结果
for(int i=0;i<c.length;i++) {
System.out.printf(" %d ",c[i][0]);
}System.out.printf("\n");
for(int i=0;i<c.length;i++) {
System.out.printf(" %d ",c[i][1]);
}System.out.printf("\n");
for(int i=0;i<a.length;i++) {
System.out.printf(" %.2f",a[i]);
}System.out.printf("\n");
3. //排序后结果
Quicksort sort=new Quicksort(a,c,0,a.length); **//这里调用前面学过的快速排序法。**
System.out.printf("排序后的结果\n");
for(int i=0;i<c.length;i++) {
System.out.printf(" %d ",c[i][0]);
}System.out.printf("\n");
for(int i=0;i<c.length;i++) {
System.out.printf(" %d ",c[i][1]);
}System.out.printf("\n");
for(int i=0;i<a.length;i++) {
System.out.printf(" %.2f",a[i]);
}System.out.printf("\n");
4. //贪心算法求最大价值装载方法。
for(int i=0;i<c.length;i++) {
if(c[i][1]<=max) {
a[i]=1;
max=max-c[i][1];
maxvalues=maxvalues+c[i][0];
}
else {
a[i]=(double)(max/c[i][0]);
maxvalues= (maxvalues+a[i]*c[i][0]);
}
}
for(int i=0;i<a.length;i++) {
System.out.printf(" %.2f",a[i]);
}System.out.printf("\n");
System.out.println("maxvalues: "+maxvalues);
}
}
class Quicksort{
Quicksort(){};
Quicksort(double a[],int c[][],int p,int r){
if(p<r) {
int q=partition(a,c,p,r);
quicksort(a,c,p,q);
quicksort(a,c,q+1,r);
}
}
public void quicksort(double[] a,int c[][], int p, int r) {
// TODO Auto-generated method stub
if(p<r) {
int q=partition(a,c,p,r);
quicksort(a,c,p,q);
quicksort(a,c,q+1,r);
}
}
public int partition(double a[],int c[][],int p,int r) {
int i=p;
int j=p;
int k=p;
double x=a[i];
int point=0;
double b[] =new double [a.length];
int [] [] c1=new int [a.length][a.length];
for(i=p;i<r;i++) {
if(a[i]>=x) {
a[j]=a[i];
c[j]=c[i];
j++;
}
if(a[i]<x) {
b[k]=a[i];
c1[k]=c[i];
k++;
}
}
k=p;point=j-1;
double temp=a[point];
a[point]=a[p];a[p]=temp;
int temp0=c[point][0];
c[point][0]=c[p][0];c[p][0]=temp0;
int temp1=c[point][1];
c[point][1]=c[p][1];c[p][1]=temp1;
for(j=point+1;j<r;j++) {
a[j]=b[k];
c[j]=c1[k];
k++;
}
return point;
}
}
```结果:
1,10,2,5,12,4,12,3,78,2
4
1 2 12 12 78
10 5 4 3 2
0.10 0.40 3.00 4.00 39.00
排序后的结果
78 12 12 2 1
2 3 4 5 10
39.00 4.00 3.00 0.40 0.10
1.00 0.17 0.17 1.00 2.00
maxvalues: 86.0