如何使用贪心算法,解决找零钱问题,使得找零钱的问题所找出的硬币数量最少呢

贪心算法

问题描述:如何使用贪心算法,使得找零钱的问题所找出的硬币数量最少呢

什么是贪心算法?

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

 package 算法设计与分析;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Scanner;
     public class FindMoney {
         public static int MAX=10;//最大种类的面额有十种,
         //把所有金额的钱换成最小份额的钱
          public static double  Value[]={10000,5000,2000,1000,500,200,100,50,20,10};
          //public static double  Value[]={100,50,20,10,5,2,1,0.5,0.2,0.1};
         public static int num[]=new int[MAX];
         public static void main(String[] args) {
             //创建了一个动态的长度可变的数组
             List ag=new ArrayList();
             //通过一个for循环去向创建的数组中添加对象
             for(int i=0;i<Value.length;i++){
                 ag.add(Value[i]);
             }
             System.out.println("请输入要换的数值");
             Scanner scanner=new Scanner(System.in);
             //从键盘中读取一个double类型的数
             double a=scanner.nextDouble();
             //将输入的钱进行类型转换
             conver(a*100);
             System.out.println("找零");
             //通过一个贪心算法将你输入的钱进行处理
             for(int i=0;i<MAX;i++){
                 if(num[i]>0){
                     System.out.println("面值"+Value[i]/100+"一共需要 "+num[i]+"张");
                 }
             }
         }
         private static void conver(double a) {
             // TODO Auto-generated method stub
             //继承上面的方法
             int i,j;
             for( i=0;i<MAX;i++)
                 //当剩余没有找的钱大于数组中的钱时
                 if (a>Value[i])
                     break;
             while (a>0&&i<MAX){
                 if(a>=Value[i]){
                     //a=a-Value[i]
                     a-=Value[i];
                     num[i]++;
                 }else if(a<10&&a>=5){
                     num[MAX-1]++;
                     break;
                 }else
                     i++;
             }
         }
     }

运行结果

 

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LNORA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值