当前位置: 代码迷 >> J2SE >> 求个出发票算法解决方法
  详细解决方案

求个出发票算法解决方法

热度:31   发布时间:2016-04-24 01:08:17.0
求个出发票算法
目前有面额100元,50元,30元,20元的发票并且库存有限,有某笔消费金额为total元,
求给出张数之和最小的发票组合?

抽象成java代码如下
HashMap<Integer,Long> invoiceMap=new HashMap<Integer,Long>()//存放发票面额和库存
invoiceMap.put(30,10L);
invoiceMap.put(50,3L);
invoiceMap.put(20,5L);
invoiceMap.put(100,10L);
int total=130;
HashMap<Integer,Long> result=invoiceMethod(invoiceMap,total);
求实现这个方法invoiceMethod(invoiceMap,total)?

------解决方案--------------------
Java code
public class Equals1 {    //    面值    int[] values= {100,50,30,20};    int[] zhangshu = {0,0,0,0};//张数//  库存    HashMap<Integer, Integer> invoiceMap=new HashMap<Integer, Integer>();    int total = 150;    public Equals1(){        invoiceMap.put(30,3);        invoiceMap.put(50,3);        invoiceMap.put(20,5);        invoiceMap.put(100,2);    }    public int action(int index,int tail){        if(index>values.length - 1){            return -1;        }        zhangshu[index] = Math.min(tail/values[index],invoiceMap.get(values[index]));        tail -= zhangshu[index]*values[index];        if(tail==0){            return 0;        }        else{            for(int i= 0;i <=zhangshu[index];zhangshu[index]--){                 if(action(index+1,tail)==0){                     return 0;                 }                 tail += values[index];            }        }        return tail;    }    public static void main(String[] args) {        Equals1 a = new Equals1();        int total = 500;        a.action(0,total);        if(a.action(0,total)==0){            for(Integer it:a.zhangshu){                System.out.print(it+" ");                }        }        else{            System.out.print("不能分配该数字。");            }    }}
------解决方案--------------------
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

import org.junit.Test;

public class FP {
HashMap<Integer, Long> invoiceMap = new HashMap<Integer, Long>();// 存放发票面额和库存

ArrayList<Integer> list = new ArrayList<Integer>();

public FP() {
invoiceMap.put(30, 10L);
invoiceMap.put(50, 3L);
invoiceMap.put(20, 5L);
invoiceMap.put(100, 10L);

Set<Integer> set = invoiceMap.keySet();
Iterator<Integer> it = set.iterator();
while (it.hasNext()) {
list.add(it.next());
}
Collections.sort(list);
Collections.reverse(list);
// int total = 130;
}

public HashMap<Integer, Long> invoiceMethod(
HashMap<Integer, Long> invoiceMap, int total) {

for (int i = 0; i < list.size(); i++) {

if (total >= (Integer) list.get(i)) {
int count = total / list.get(i);

// invoiceMap 的数值发生变化
invoiceMap
.put(list.get(i), invoiceMap.get(list.get(i)) - count);
// total 减少数据
total -= count * list.get(i);
}
}
return invoiceMap;
}

private void pt(Object integer) {
System.out.println(integer);
}

@Test
public void t() {
FP f = new FP();
invoiceMethod(invoiceMap, 150);
pt(invoiceMap);
}
}
  相关解决方案