zoukankan      html  css  js  c++  java
  • Java蓝桥杯——贪心算法

    贪心算法

    贪心算法:只顾眼前的苟且。
    即在对问题求解时,总是做出在当前看来是最好的选择

    如买苹果,专挑最大的买。

    最优装载问题——加勒比海盗

    货物重量:Wi={4,10,7,11,3,5,14,2}
    海盗船载重:C
    求如何拿货件数最多

    package bb;
    import java.util.Arrays;
    public class 最优装载 {
    	static int[] W = { 4, 10, 7, 11, 3, 5, 14, 2 };
    	static int C = 30;
    	// 开发效率:
    	// 运行效率:
    	public static void main(String[] args) {
    		int count = 0;
    		Arrays.sort(W);
    		for (int n : W) {
    			System.out.println(n);
    		}
    		System.out.println("------------");
    		// 从小的开始装
    		for (int i = 0; i < W.length; i++) {
    			if (C < W[i]) {
    				// 剩余的载重量装不下一件
    				break;
    			} else {
    				System.out.println(W[i] + " ");
    				count++;// 装进来
    				C = C - W[i];
    			}
    		}
    		System.out.println("一共带走:" + count + "件");
    	}
    }
    

    阿里巴巴

    山洞有宝贝n件,重量w,价值v
    毛驴能运的重量最大为m,宝贝可以切开。问:如何带走价值最大的宝贝?
    策略1:选价值最大——不行
    策略2:选重量最小——不行
    策略3:性价比(单位重量价值最大)
    测试数据:
    static int m = 30;
    static int w[] = { 4, 2, 9, 5, 5, 8, 5, 4, 5, 5 };
    static int v[] = { 3, 8, 18, 6, 8, 20, 5, 6, 7, 15 };
    (背包问题——物品可以切割,0-1背包问题——不能切割,贪心算法不能得到最优解)

    package bb;
    import java.util.Arrays;
    import java.util.Comparator;
    public class 阿里巴巴 {
    	// 第一套数据
    	// static int m = 30;//(总价值70.5,装入5.25件)
    	// static int w[] = { 4, 2, 9, 5, 5, 8, 5, 4, 5, 5 };
    	// static int v[] = { 3, 8, 18, 6, 8, 20, 5, 6, 7, 15 };
    	// 第二套数据(总价值24.6,装入4.3件)
    	static int m = 19;
    	static int w[] = { 2, 6, 7, 4, 10, 3 };
    	static int v[] = { 8, 1, 9, 3, 2, 4 };
    	public static void main(String[] args) {
    		Goods[] gs = new Goods[w.length];
    		for (int i = 0; i < w.length; i++) {
    			gs[i] = new Goods();
    			gs[i].w = w[i];
    			gs[i].v = v[i];
    			gs[i].cost_performance = (double) v[i] / w[i];// 性价比
    		}
    		Arrays.sort(gs, new Comparator<Goods>() {
    			@Override
    			public int compare(Goods o1, Goods o2) {
    				return -o1.cost_performance.compareTo(o2.cost_performance);
    			}
    		});
    		double vTotal = 0.0;
    		for (Goods g : gs) {
    			System.out.println(g.w + "	" + g.v);
    			if (m > g.w) {
    				m = m - g.w;// 剩余能带走的重量
    				vTotal += g.v;
    			} else {
    				double 切割比例 = (double) m / g.w;
    				double 最后价值 = g.v * 切割比例;
    				vTotal += 最后价值;
    				break;
    			}
    		}
    		System.out.println("共带走价值" + vTotal + "的宝贝");
    	}
    }
    class Goods {
    	int w;
    	int v;
    	Double cost_performance;
    }
    
  • 相关阅读:
    java集合
    移动web页面给用户发送邮件的方法
    如何用CSS和jQuery实现一个侧滑导航菜单
    基于jq的表单填充
    使用JS代码实现点击按钮下载文件
    变量,作用域和内存问题
    如何实现单行/多行文本溢出的省略(...)
    CSS中浮动和定位对元素宽度/外边距/其他元素所占空间的影响
    【javascript】函数中的this的四种绑定形式
    前端开发利器webStorm
  • 原文地址:https://www.cnblogs.com/tigerlion/p/11190989.html
Copyright © 2011-2022 走看看