贪心算法例题

这篇具有很好参考价值的文章主要介绍了贪心算法例题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        贪心算法例题

目录

贪心算法

找零问题

最大的金额

堆果子


贪心算法

        贪心算法(greedy algorithm ,又称贪婪算法)是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解 。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择 。

找零问题

币种:1 2 4 5 10 若干张,找零:n元。输出找零方案

思路:

(1)因为贪心是要找到最优解,所以我们要从最大的币值开始寻找

(2)每次找到符合条件的币值时,就让n减去已经找到的钱,然后继续循环,直到n不大于0时停止

import java.util.Scanner;

public class Greed {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        greedy(n);
    }

    public static void greedy(int n) {
        int[] money = {10, 5, 4, 2, 1};//钱的面值,从大到小,因为要找最优解。
        int i = 0;//表示目前用money数组中哪一个面值的钱去找零,最开始从10快开始。
        int[] num = new int[money.length];
        while (n > 0) {//n>0说明钱还没有找完,所以继续循环
            if (n >= money[i]) {//剩余要找的钱必须大于等于当前money[i]这个面值
                int zs = n / money[i];
                n -= zs * money[i];
                num[i]+= zs;//当前这个面值的数量加上zs
            } else{//如果当前面值不能找开就i++
                i++;
            }
        }
        for (int j = 0; j < num.length; j++) {//输出
            if (num[j] > 0) {//说明当前这个面值的钱使用到了,所以才能输出
                System.out.printf("面值:%d 张数:%d ", money[j], num[j]);
            }
        }
    }
}

贪心算法例题            


最大的金额

        假如整数n表示当前奖池中已经有的钱的总数,请你从n中删除m个数字,余下的数值对应的金额就是可以拿走的钱,我们知道人性是贪婪的,那么请帮助小明,使得余下的数字按原次序组成的新数最大。

比如当n = 92081346718538,m = 10时,则新的最大数是9888

样例输入:

92081346718538 10

1008908 5

样例输出:

9888

98

思路:

(1)先将删除问题变成保留问题,利用贪心的思想,每次在非保留的个数外寻找最大值

(2)假设输入92081346718538 10,所以我们要在14个数中删除10个,所以我们可以在前11个数中选择一个最大值,然后下次循环在从这个最大值到第12个数中寻找最大的数,直到for循环的i等于被保留的数时停止。

import java.util.Scanner;

public class selectMaxNumber {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String n = scanner.next();//输入n为String类型
            int m = scanner.nextInt();//输入需要删除数的个数
            if (n.length() <= m) {
                System.out.println("输入错误,请重新输入");
            }
            char[] a = n.toCharArray();//将String类型的数转为char数组,为了循环判断使用
            String max = "";//定义max变量存放最后早到的最大数
            int retain = a.length - m;//将删除问题变成保留问题
            int lastselect = -1;//存放最大数在数组中的位置,开始的时候定义为-1,在循环时在+1就从0开始了
            for (int i = 1; i <= retain; i++) {
                char big = '0';//循环比较前先假设big为最小的值
                    for (int j = lastselect + 1; j < a.length - (retain - i); j++) {
                    //这里lastselect+1主要是因为在找到一个最大的数后下次循环就从这个最大数的下一个开始
                    /*
                    j < a.length - (retain - i)这个区间判断方法是
                    第一次循环判断的范围是j < 11,也就是0到10,因为总共有14个数,需要保留四个,
                    所以第一次就需要在前11个中选择一个最大的数,然后每次循环结束范围都要往后移一位
                    例如:92081346718538删掉十个数,第一次循环判断在92081346718中
                    第二次循环判断在20813467185中,第三次在134671853中,第四次就在538中
                     */

                    if (a[j] > big) {
                        big = a[j];
                        lastselect = j;//找到大的数就将j赋给存放最大数地址的这个变量
                    }
                }
                max += big;//每次找出那个最大的数后就拼接到max中
            }
            System.out.println(max);
        }
    }
}

贪心算法例题 


堆果子

        在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆,多多决定把所有的果子合成堆,每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有果子经过n-1次合并后,就只剩下了一堆,多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。

        因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能的节省体力,假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务就是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小体力的值。

输入:第一行:一个整数n(1<=n<=100),表示果子的种类数。第二行:包含n个整数,用空格分隔。n等于0时自动退出

思路:

(1)如果n==0就停止,n==1就直接输出重量

(2)如果n>1就循环,首先将数组从小到大排序,然后每次循环都将数组的第一个数和第二个数相加,空余的位置给无限大,这样就可以循环相加了。

import java.util.Arrays;
import java.util.Scanner;

public class pileFruit {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int n = scanner.nextInt();//输入果子总共的堆数
            int[] m = new int[n];//表示n堆果子重量的数组
            if (n == 0) break;//n==0时直接结束
            if (n == 1) {
                //如果只有一堆果子,就直接输出这堆果子的重量
                System.out.println(scanner.nextInt());
                continue;
            }
            for (int i = 0; i < n; i++) {
                m[i] = scanner.nextInt();//输入每堆果子的重量
            }
            int sum = 0;//记录总共搬运的重量
            for (int i = 0; i < n - 1; i++) {//循环n-1次,例如三堆果子只需要搬2次
                Arrays.sort(m);//将m数组排序
                sum = sum + m[0] + m[1];//先从最轻的开始合并
                m[0] += m[1];//搬完后m[0]就表示合并后的重量
                m[1] = Integer.MAX_VALUE;//然后m[1]给无穷大,这样每次循环就会到数组最后
                System.out.println(Arrays.toString(m));//查看数组数的排序
            }
            System.out.println(sum);
        }
    }
}

贪心算法例题

 可以看出输出了每次排序前的数组,也输出了最后总共消耗的体力。

贪心算法例题

 文章来源地址https://www.toymoban.com/news/detail-415376.html

到了这里,关于贪心算法例题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 贪心算法基础及leetcode例题

    参考 本质: 找到每个阶段的局部最优,然后去推导得到全局最优 两个极端: 常识很难: 很多同学通过了贪心的题目,但都不知道自己用了贪心算法,因为贪心有时候就是常识性的推导,所以会认为本应该就这么做! 套路: 贪心没有套路,说白了就是常识性推导加上举反例

    2023年04月20日
    浏览(75)
  • 华为OD机试题中 动态规划和贪心算法例题

    在 ACM 比赛中,有许多常见的编程算法和数据结构经常被使用。本系列博客会罗列各种常见算法,以及其代表性例题。 这部分内容可以用于类似华为 OD 机考学习。 动态规划是一种将复杂问题分解为简单子问题并使用子问题的解来构建更大问题的方法。它通常用于解决最长公

    2024年01月16日
    浏览(47)
  • 【算法 - 动态规划】找零钱问题Ⅲ

    在前面的动态规划系列文章中,关于如何对递归进行分析的四种基本模型都介绍完了,再来回顾一下: 从左到右模型 : arr[index ...] 从 index 之前的不用考虑, 只考虑后面的该如何选择 。 范围尝试模型 :思考 [L ,R] 两端,即 开头和结尾 处分别该如何取舍。 样本对应模型 :

    2024年04月09日
    浏览(43)
  • 贪心算法问题实验:贪心算法解决TSP问题

    TSP问题是指旅行商问题,即给定一组城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。它是组合优化中的一个NP困难问题,在运筹学和理论计算机科学中有着广泛的应用。 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最

    2024年02月03日
    浏览(43)
  • 算法题:摆动序列(贪心算法解决序列问题)

    这道题是一道贪心算法题,如果前两个数是递增,则后面要递减,如果不符合则往后遍历,直到找到符合的。(完整题目附在了最后) 代码如下: 完整题目: 376. 摆动序列 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为  摆动序列 。 第一个差(如果

    2024年02月07日
    浏览(69)
  • 贪心算法(区间问题)

    有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中 points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend 之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭,若有一个气

    2024年03月11日
    浏览(71)
  • 打水问题(贪心算法)

    题目:有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2………tn为整数且各不相等,应如何安排他们的打水顺序才能使他们总共花费的时间最少?通过键盘输入排队打水的人数以及每人打水的时间和水龙头数,使用贪心算法求出所有人完成打水总共花费的时间的最

    2024年04月28日
    浏览(53)
  • 贪心算法——背包问题

    14天阅读挑战赛 目录 1.题目描述      2.问题分析 3.算法设计 4.C++程序

    2023年04月18日
    浏览(76)
  • 【算法-贪心】分数背包问题

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月08日
    浏览(43)
  • Java 贪心算法经典问题解决

    题目 一块金条切成两半,是需要花费和长度数值一样的铜板的。比如 长度为20的 金条,不管切成长度多大的两半,都要花费20个铜 板。一群人想整分整块金 条,怎么分最省铜板? 例如,给定数组{10,20,30},代表一共三个人,整块金条长度为 10+20+30=60. 金条要分成10,20,30三个部分

    2024年02月16日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包