找钱问题也是贪心算法的常见题
是利用贪心算法以局部最优来实现全局最优
问题描述
假如我们有面额为5元,、100元、50元、20元、1元、10元若干张,现在需要找零157元,以最少的张数把他找完需要少张钱。其实贪心算法找钱问题和人一样都是先取面额最大的然后进行比较,少了的话就看最大的还能不能取,不能取就看数额排第二的,以此类推。直达满足条件157,。
157=100+50+5+1+1
代码如下
package itheima_3;
import java.util.ArrayList;
public class test {
public static void main(String[] args) {
int[] tic={5,100,50,20,1,10}; //面额,设每样面额都有n张
for (int i=0;i<tic.length-1;i++){//对金额进行排序,降序
for(int j=0;j<tic.length-1-i;j++){
if(tic[j]<tic[j+1]){
int t=tic[j];
tic[j]=tic[j+1];
tic[j+1]=t;
}
}
}
ArrayList<Integer> shortTic = new ArrayList<Integer>();
ArrayList<Integer> tolite=new ArrayList<Integer>();
tolite.add(0);//占位
int gol=157;//需要找的金额
for (int i=0;i<tic.length;i++){//把金额转为集合以便进行删除操作
shortTic.add(tic[i]);
}
while (true){ //循环判断取钱
int too = 0;
for (int i=0;i<tolite.size();i++){
too=too+tolite.get(i);
}
if(too==gol){
break;
}else if (too>gol){
tolite.remove(tolite.size()-1);//删除已取数额最后一个
shortTic.remove(0);//删除shortTic中最大的金额
}else{
tolite.add(shortTic.get(0));//取最大数额
}
// System.out.println(tolite);
}
tolite.remove(0);//删除占位
System.out.println("总金额:"+gol);
System.out.println("最终选择面额:"+tolite+" 最少可选:"+tolite.size()+"张");
}
}