Java蓝桥杯——贪心算法

博客介绍了贪心算法,即在求解问题时总是做出当前最好的选择。以加勒比海盗最优装载问题为例,探讨如何使拿货件数最多;还提及阿里巴巴山洞选宝贝问题,分析不同策略,指出选性价比最大的策略可行,同时提到背包问题中贪心算法的局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

贪心算法

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

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

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

货物重量: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;
}

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

### Java蓝桥杯竞赛历年真题 关于Java蓝桥杯竞赛的历年真题,这类题目通常涵盖了广泛的计算机科学基础知识以及编程技巧。对于特定类型的算法问题,如图论中的着色问题,可以参考如下示例[^1]: #### 图的着色问题实例 给定`n`个人参加某项特殊考试。为了保证公平性,规定任何两个相识的人不得被分配到同一考场。此问题可以通过构建无向图来表示人与人间的关系,其中顶点代表考生,边则连接相互认识的两人。目标是最小化所需的不同颜色数目——即考场数量,使得相邻节点不会拥有相同颜色。 ```java import java.util.*; public class ExamArrangement { private static int minColors(int[][] graph) { List<Integer>[] adjList = new ArrayList[graph.length]; Arrays.setAll(adjList, k -> new ArrayList<>()); for (int i = 0; i < graph.length; ++i) for (int j = i + 1; j < graph[i].length; ++j) if (graph[i][j] == 1){ adjList[i].add(j); adjList[j].add(i); } Map<Integer, Integer> colorMap = new HashMap<>(); boolean[] usedColor; int maxColor = 0; for (int v = 0; v < graph.length; ++v) { usedColor = new boolean[maxColor + 1]; for (Integer u : adjList[v]) if (colorMap.containsKey(u)) usedColor[colorMap.get(u)] = true; int clr = 0; while(clr < usedColor.length && usedColor[clr]) ++clr; colorMap.put(v, clr); if (clr >= maxColor) maxColor = clr + 1; } return maxColor; } } ``` 上述代码实现了基于贪心策略解决最小染色数目的方法,适用于处理此类关系约束下的资源分配挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值