贪心算法:只顾眼前的苟且。
即在对问题求解时,总是做出在当前看来是最好的选择
如买苹果,专挑最大的买。
货物重量: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; }