毕业后就怎么学过算法,还在上学的时候学过数据结构,现在基本上都还给老师了,可惜老师学费没有还给我。。。
情景: 类似于给定一个数字,算他由多少个数字组成,比如:36 现在有10、5、1 ,那么最佳帅3个10,1个5,1个1组成(默认优先取最大)。因为我们这边业务上面需要开发票,有的时候不想一个一个算,就让我们写一个。但是他发票的个数不是固定的、无尽的,所以每次就要判断下,如果:36 现在基数还是10、5、1 但是 只让你拿1个10、2个5、若干个1,那么组合应该是:1个10,2个5,16个1,大概就是这个意思。
添加两个list,一个存放基数(从大到小)另外一个存放基数的对应个数。
List list = new ArrayList(); list.add(10); list.add(100); list.add(1); list.add(20); list.add(50); list.add(5); Collections.sort(list, Collections.reverseOrder()); List list2 = new ArrayList(); list2.add(1); //100对应个数(下同) list2.add(4); //50 list2.add(1); //20 list2.add(20); //10 list2.add(50); //5 list2.add(1000); //1
下面就是递归了。。没有啥难度。。参数分别是: 输入的总数,集合的初始下标,基数集合,基数个数集合
public void c(int totle, int flag, List list, List list2) { //System.out.println("当前总额" + totle + ",当前额度" + list.get(flag)); int sum = 0; for (int i = 0; i < list.size(); i++) { sum += (int) list.get(i) * (int) list2.get(i); } if (sum < totle) { System.out.println("发票总额不够,请添加发票!!!!"); } else { if (totle % (int) list.get(flag) == 0) { int s = totle / (int) list.get(flag); //System.out.println(s + ""); if (s > (int) list2.get(flag)) { System.out.println("需要" + list.get(flag) + "元的发票" + s + "张,目前只有" + list2.get(flag) + "张,全部使用!"); totle -= (int) list2.get(flag) * (int) list.get(flag); System.out.println(totle); c(totle, ++flag, list, list2); } else { System.out.println("需要" + list.get(flag) + "元的发票" + s + "张"); } } else { int s = totle / (int) list.get(flag); if (s > (int) list2.get(flag)) { System.out.println("需要" + list.get(flag) + "元的发票" + s + "张,目前只有" + list2.get(flag) + "张,全部使用!"); totle -= (int) list2.get(flag) * (int) list.get(flag); System.out.println(totle); c(totle, ++flag, list, list2); } else { totle = totle % (int) list.get(flag); System.out.println("需要" + list.get(flag) + "元的发票" + s + "张"); System.out.println(totle); c(totle, ++flag, list, list2); } } } }
假设:
c(365, 0, list, list2);
输出
如果输入超过所有的总额,那么如下:
很简单,记录一下,也是提醒下自己,算法也是蛮重要的。。。没事也要跟着慢慢研究!!!
时间: 2024-12-28 16:50:54