贪心法(四)—— 最优装载问题、部分背包问题、 乘船问题

最优装载问题

在这里插入图片描述
思路:题目主要想要更多的物体,那么从小到大对物体重量排序,依次选取(只要不超过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;
  }  
}
发布了77 篇原创文章 · 获赞 100 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/S_123789/article/details/104336938