问题一:最优装载问题
给定n个物体,第i个物体的重量是wi,选择尽量多的物体,使其重量不超过c
import java.util.Arrays;
import java.util.Scanner;
public class 最优装载问题 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] w=new int[n];
for (int i = 0; i < n; i++) {
w[i]=sc.nextInt();
}
int c=sc.nextInt();
Arrays.sort(w);
int ans=f(n,w,c);
System.out.println(ans);
}
private static int f(int n, int[] w, int c) {
int sum=0;
int cnt=0;
for (int i = 0; i < n; i++) {
sum+=w[i];
if (sum<=c) {
cnt++;
}else
break;
}
return cnt;
}
}
问题二:部分背包问题
import java.util.Arrays;
public class 部分背包问题 {
public static void main(String[] args) {
int[] w= {1,2,3,4,5};
int[] v= {3,4,3,1,4};
int n=w.length;
double c=10;//规定一个重量
Obj[] objs=new Obj[n];
for (int i = 0; i < n; i++) {
objs[i]=new Obj(w[i],v[i]);//打包
}
Arrays.sort(objs);
double cc=c;
double maxValue=0;
for (int i = n-1; i >=0; i--) {
if (objs[i].w<=cc) {
maxValue+=objs[i].v;
cc-=objs[i].w;
}else {
maxValue+=objs[i].v*(cc/objs[i].w);//把缺少的那部分的重量所占的价格算进去
break;
}
}
System.out.println(maxValue);
}
private static class Obj implements Comparable<Obj>{
int w;
int v;
public Obj(int w,int v) {
this.w=w;
this.v=v;
}
public double getPrice() {
return v/(double) w;//计算单价
}
public int compareTo(Obj o) {
if(this.getPrice()==o.getPrice()) return 0;
else if(this.getPrice()<o.getPrice()) return -1;
else return 1;
}
}
}