算法学习——贪心算法之币种统计

算法描述

币种统计

单位给每一位员工发工资(精确到元),为了保证不临时换零钱,使得每个员工取款的张数最少,在取工资前统计所有员工所需要的各种票面的张数(约定票种为100,50,20,10,5,2,1元),并验证币种统计是否正确

算法思路

  1. 算法描述其实是省略了要求,用户肯定是要输入员工数以及各位员工的工资

    定义:n位员工,G[n]对应了第n员工的工资

  2. a数组存放100元到1元的面值,a[0]=100,a[1]=50...
  3. b数组对应每个面值的张数,b[0]对应100元的张数,b[1]对应50元的张数...
  4. 采用贪心策略,每次取最大面值

算法实现

    System.out.println("输入员工数n:");
    Scanner scanner = new Scanner(System.in);
    int n=scanner.nextInt();

    System.out.println("依次输入员工的工资");
    int[] G = new int[n];
    for(int i=0;i<n;i++){
        G[i]=scanner.nextInt();
    }
    scanner.close();

    int sumG = 0;//计算全体员工工资总和,便于之后的验证
    int sum = 0;
    for(int i=0;i<G.length;i++){
        sumG = sumG + G[i];
    }

    int[] a = {100,50,20,10,5,2,1};//7个面值不同币种
    int[] b = new int[7];//存放个面值对应的张数
    boolean flag = true;

    for(int i=0;i<G.length;i++){
        for(int j=0;j<a.length;j++){
            while(G[i]>=a[j]){//每次取最大面值
                G[i]=G[i]-a[j];
                b[j]++;//当前面值对应的张数+1
            }
        }
    }
    //显示各面值对应需要的张数
    for(int i=0;i<b.length;i++){
        System.out.println("需要"+b[i]+"张面值为"+a[i]+"元的纸币");
        sum = sum+b[i]*a[i];
    }

    //验证,各个面值与其对应的张数想乘的总和等于全部员工工资的总和,则说明算法正确
    if(sumG==sum){
        System.out.println("该算法正确!");
    }

结果

原文地址:https://www.cnblogs.com/kexing/p/9862350.html

时间: 2024-10-28 15:49:12

算法学习——贪心算法之币种统计的相关文章

算法学习——贪心算法之删数字(求最大值)

算法描述 在给定的n位数字,删除其中的k位数字( k < n),使得最后的n-k为数字为最大值(原次序不变) 算法思路 考虑到是要移出数字,我们使用链表设计此算法较为方便,链表可以直接移出某个位置的元素 使用贪心算法,每一步都要达到最优 从最高位开始,若是下一位比上一位大,则比上一位的数字移出,结束之后再次从最高位开始 例如 16489657 删除4个数字 首先比较1和6 删除1 得到 6489657 之后,再次比较 6和4 往后推 可得到 689657 以此类推 删除4个数字之后 可得到 96

算法学习——贪心算法之删数字(求最小值)

算法描述 在给定的n位数字,删除其中的k位数字( k < n),使得最后的n-k为数字为最小值(原次序不变) 算法思路 考虑到是要移出数字,我们使用链表设计此算法较为方便,链表可以直接移出某个位置的元素 使用贪心算法,每一步都要达到最优 从最高位开始,若下一位比上一位要小,则将上一位的数字移出,结束之后再次从最高位开始 这里需要注意,会有特例 当输入从小到大的的一个数的时候,上述算法将会无法运行,比如123456,删除1个数字变为最小,我们把6删去,这样才是最小的(即从末尾删除数字) 算法实现

算法学习——贪心算法之可拆背包

算法描述 已知道n种物品和一个可容纳c重量的背包,第i种物品的重量为wi,价值为pi,装包的时候可以把物品拆开(即可只装每种物品的一部分),设计如何装包,使装包所得整体的价值最高? 算法思路 首先,我们要知道,n种物品以及他们对应的价值,都是由用户输入的 我们使用贪心算法,每一步取最大效益的物品放入背包之中(及单位价值为最高的物品 单位价值=pi/wi) 由以上思路,我们可以定义一个二维数组来接收用户输入的数值 w[i][0] 代表了第i种物品的重量(即wi) w[i][1] 代表了第i种物品的

算法学习——分治算法

这是从网上查到的概念资料,先收来~ 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关.问题的规模越小,越容易直接求解,解题所需的计算时间也越少.例如,对于n个

五大算法思想—贪心算法

贪心法理解 贪心法在解决问题的策略上目光短浅,只根据当前已有的信息就做出选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变.换言之,贪心法并不是从整体最优考虑,它所做出的选择只是在某种意义上的局部最优. 一句话:不求最优,只求可行解. 判断贪心法 对于一个具体的问题,怎么知道是否可用贪心算法解此问题,以及能否得到问题的最优解? 我们可以根据贪心法的2个重要的性质去证明:贪心选择性质和最优子结构性质. 1.贪心选择性质 什么叫贪心选择?从字义上就是贪心也就是目光短线,贪图眼前利益,在

算法导论--贪心算法与动态规划(活动选择问题)

活动选择问题 有一个教室,而当天有多个活动,活动时间表如下:找出最大兼容活动集!活动已按结束时间升序排序. 动态规划 采用动态规划需要满足两个条件:1.最优子结构2.子问题重叠 令Sij表示在ai结束后和aj开始前活动的集合,假定Aij为活动集合Sij的最大兼容子集,其中包含活动ak.问题变成求Sik与Skj最大兼容活动子集Aik与Akjz.我们用c[i,j]表示Sij的最优解的大小. 则c[i,j] = c[i,k]+c[k,j]+1;最后我们需要遍历所有可能的k值,找出最大的一个划分作为c[

增强学习贪心算法与Softmax算法

(一) 这个算法是基于一个概率来对探索和利用进行折中:每次尝试时,以概率进行探索,即以均匀概率随机选取一个摇臂,以的概率进行利用,即以这个概率选择当前平均奖赏最高的摇臂(如有多个,则随机选取). 其中:小k表示第k个摇臂.因为大K表示摇臂总数:n表示尝试的次数,vn表示第n次尝试的奖赏. Qn的直观意思为:为前n-1次的平均奖赏.当其与n-1相乘所得是前n-1次总奖赏.再加上第n次的奖赏,处于n,则为n次的平均奖赏. 其中:argmax为选取最优的Q(i).count是从0开始的,故count(

数据结构与算法之贪心算法 C++实现

1.基本思路:从问题的某一个初始解触发逐步逼近给定的目标,以尽可能快的求得更好的解.当达到算法中某一步不能再继续前进时,就停止算法,给出近似值.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择. 存在的问题: 1.不能保证最后的解是最优的: 2.不能用来求最大或最小解的问题: 3.只能求满足某些约束条件的可行解的范围. 实现过程: 从问题的某一初始解出发: while (能朝给定总目标前进一步) { 利用可行的决策,求出可行解的一个解元素: } 由所有解元素组合成

【算法】贪心算法_节目时间安排问题

问题描述 “今年暑假不学习?” “是吗?那你打算干什么呢?” “看电视剧呀!” “那么多电视剧你看得完吗?” "对哦,那是的好好安排一下节目了." 确实如此,暑假来了,假期档的电视剧也来了,估计很多电视迷会抛开学业,奔向电视. 作为电视迷,一定想看在一天内看尽量多的完整的电视剧.当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事).流淌的美好时光.长安十二时辰.陈情令,以及王小丫的<开心辞典>等等,假设你已经知道了所有你喜欢看的电视