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 + "\t" + 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;
}
posted @ 2019-07-15 19:43  虎老狮  阅读(563)  评论(0编辑  收藏  举报