集合中某几个数字之和等于一个固定值 java

思路 先找出 集合中 所有元素组合方式 然后根据组合方式 进行相加匹配和
本代码有一处需要优化的地方 有大佬能帮忙优化就万分感谢了 暂时 此段代码 检索小集合没有问题
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);
			}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值