Java蓝桥杯――贪心算法

匿名 (未验证) 提交于 2019-12-02 21:52:03

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

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

货物重量: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; }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!