最优装载问题
思路:
题目主要想要更多的物体,那么从小到大对物体重量排序,依次选取(只要不超过c)就行。
public class Main{
public static void main(String[] args) {
int []w = {1,3,6,2,1,5,9};
int C = 0;
System.out.print(solve(w,C));
}
private static String solve(int[] w, int c) {
Arrays.sort(w);
int sum=0;
StringBuilder sn = new StringBuilder();
for(int i=0;i<w.length;i++){
sum+=w[i];
if(sum <= c) sn.append(w[i]);
else break;
}
return sn.toString();
}
}
部分背包问题
思路:
将重量与价值封装为一个类,实现Comparable接口,按照性价比(v/w)
从大到小排序,每次选取性价比最大的物品。
public class Main{
public static void main(String[] args) {
int []w = {1,2,3,4,5};
int []v = {3,4,3,1,4};
double C = 10;
int n = w.length;
Obj []price = new Obj[n];
for(int i=0;i<n;i++){
price[i] = new Obj(w[i],v[i]);
}
Arrays.sort(price);
double c = C;
double maxvalue=0;
for(int i=0;i<n;i++){
if(price[i].w <= c) {c-=price[i].w; maxvalue += price[i].v;}
else {maxvalue += price[i].v*(c/price[i].w); break;}
}
System.out.println(maxvalue);
}
private static class Obj implements Comparable<Obj>{
int w;
int v;
public Obj(int weight,int value){
this.w = weight;
this.v = value;
}
public double getPrice(){
return (v*1.0)/w;
}
@Override
public int compareTo(Obj o) {
if(this.getPrice() - o.getPrice() == 0 ) return 0;
else if(this.getPrice() - o.getPrice() < 0) return 1;
else return -1;
}
}
}
乘船问题
public class Main{
public static void main(String[] args) {
int []w = {1,2,3,4,5,6,7,8,9,10};
int c= 10; //船的载重量
int n = w.length; //10个人
Arrays.sort(w);
System.out.print(Boat(w,n,c));
}
public static int Boat(int []w,int n,int c){
int person = n;
int boat = 0;
int p1 = 0,p2=n-1; //两个指针
while(person > 0){
if(w[p1] + w[p2] <= c){p1++; p2--; boat++; person-=2; }
else{p2--; boat++; person--;}
}
return boat;
}
}