思路 先找出 集合中 所有元素组合方式 然后根据组合方式 进行相加匹配和
本代码有一处需要优化的地方 有大佬能帮忙优化就万分感谢了 暂时 此段代码 检索小集合没有问题
Integer[] inv2 = inv.clone();
reslist.add(inv2); 此处代码 有可能会导致 内存溢出
在此 如果代码上又和其他人冲突的 请见谅 本人手码代码无抄袭 望采纳本代码的同僚能帮忙及时更正 谢谢
static String input[] = { "2", "360.00","1231","2321", "5879.52", "8040", "14277.60" };
public static void main(String[] args) {
List<String> list = Arrays.asList(input);
List<String> list1 = new ArrayList<String>(list);
List<Integer[]> ls = Combination(list1, 0);
for (int i = 0; i < ls.size(); i++) {
Integer[] tt = ls.get(i);
System.out.print("第" + (i + 1) + "组组合元素:");
String number = "0";
for (int j = 0; j < tt.length; j++) {
System.out.print(list1.get(tt[j]) + " ");
number = addMoney(number,list1.get(tt[j]));
}
if(number.equals("28197.12")) {
System.out.println("success");
}
System.out.println(",");
}
}
public static String addMoney(String mny1, String mny2) {
if (ValidateUtil.isEmpty(mny1) || ValidateUtil.isEmpty(mny2)) {
throw new AppException("传入金额不能为空");
}
BigDecimal bmny1 = new BigDecimal(mny1);
BigDecimal bmny2 = new BigDecimal(mny2);
return bmny1.add(bmny2).toPlainString();
}
/**
* 求 某集合 所有与组合 下标 元素组合 公式 n!/r!(n-r)! 如果 r > 0 则返回的 下标组合 仅为 某一种 组合 如果 r = 0 则
* 下标组合 为 1 到 n 所有组合
*
* @param list 求组合的 集合元素
* @param r 组合长度
* @return
*/
public final static List<Integer[]> Combination(final List<String> list, final int r) {
List<Integer[]> reslist = new ArrayList<Integer[]>();
int end = list.size();
int start = 1;
if (r > 0) {
end = r;
start = r;
}
for (int i = start; i <= end; i++) {
Integer[] inv = new Integer[i];
Combination(list, 0, inv, 0,reslist);
}
return reslist;
}
public final static void Combination(final List<String> list1, final int a_pos, final Integer[] inv, final int rs_pos,List<Integer[]> reslist) {
if (rs_pos >= inv.length) {
Integer[] inv2 = inv.clone();
reslist.add(inv2);
} else
for (int ap = a_pos; ap < list1.size(); ap++) {
inv[rs_pos] = ap;
Combination(list1, ap + 1, inv, rs_pos + 1,reslist);
}
}