-
最近在做公司的活动优惠系统,需求方提出了指定药品的需求,即每个药品随意组合,价格达到门槛了就可以使用优惠券 举例:药品有 1、2、3,价格也为1、2、3 那么组合就有1、12、123、13、2、23、3 价格分别为 1、3、6、4、2、5、3 实现思路:每次先拿出数组集合中的第一个数字与其他数字进行配对组合并每次都记录下来得到结果。
- 总结:所以这个问题并非顺序组合的问题,而是一个组合积乘的问题,还有组合后的门槛比较问题。
- 组合算法代码实现(可以替换掉具体的实体对象)
- 算法实现
public class Test007 { public static void main(String[] args) { List<DTO> list = new ArrayList<>(); DTO dto = new DTO(); dto.setId("1"); dto.setPrice(1L); list.add(dto); dto = new DTO(); dto.setId("2"); dto.setPrice(2L); list.add(dto); dto = new DTO(); dto.setId("3"); dto.setPrice(3L); list.add(dto); dto = new DTO(); dto.setId("7"); dto.setPrice(3L); list.add(dto); dto = new DTO(); dto.setId("9"); dto.setPrice(3L); list.add(dto); List<Result> results = getCombination(list); } /** * 计算所有药品组合 以及组合价格 * @param array * @return */ public static List<Result> getCombination(List<DTO> array){ List<Result> result = new ArrayList<>(); int startNum = 0; int endNum = array.size(); List<DTO> DTOS = new ArrayList<>(); for(int i = startNum ; i < endNum; i ++){ DTOS.clear(); DTOS.add(array.get(i)); //传入节点结果 记录进结果 getResult(DTOS, result); int tempI = i; calculation(++ tempI, endNum, DTOS, array, result); } return result; } /** * 计算首个药品与其他药品的组合 * @param start * @param end * @param drugs * @param drugsArray * @param result */ public static void calculation(int start, int end, List<DTO> drugs, List<DTO> drugsArray, List<Result> result){ for(int i = start; i < end; i ++){ /粗糙解决数组内存地址一样的问题 List<DTO> dtos = new ArrayList<>(); for(DTO dto : drugs){ dtos.add(dto); } /粗糙解决数组内存地址一样的问题 dtos.add(drugsArray.get(i)); //传入节点结果 记录进结果 getResult(dtos, result); int tempI = i; calculation(++ tempI, end, dtos, drugsArray, result); } } /** * 处理结果 为返回结果赋值 * @param drugs * @param results */ public static void getResult(List<DTO> drugs, List<Result> results){ Result result = new Result(); List<Long> ids = new ArrayList<>(); Long price = 0L; for(DTO dto : drugs){ ids.add(Long.parseLong(dto.getId())); price += dto.getPrice(); } result.setIds(ids.toString()); result.setPrice(price); results.add(result); } }
- 实体类
class DTO { String id; Long price; public String getId() { return id; } public void setId(String id) { this.id = id; } public Long getPrice() { return price; } public void setPrice(Long price) { this.price = price; } }
- 算法实现
计算多个数字之间的唯一组合,非顺序组合 @杨章隐
于 2022-01-11 10:35:47 首次发布