贪心算法
问题描述:如何使用贪心算法,使得找零钱的问题所找出的硬币数量最少呢
什么是贪心算法?
贪心算法(又称贪婪算法)是指,在对 问题求解 时,总是做出在当前看来是最好的选择。 也就是说,不从整体最优上加以考虑, 算法 得到的是在某种意义上的局部最优解 。 贪心算法不是对所有问题都能得到整体最优解。
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++;
}
}
}
运行结果