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() {
            @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;
}

转载于:https://www.cnblogs.com/tigerlion/p/11190989.html

你可能感兴趣的:(Java蓝桥杯——贪心算法)