组合问题 之 罗列特定和的数字组合方式

package com.test.algorithm.dp;

import java.util.HashSet;
import java.util.Set;

/**
* @author hawkinswang
*
* 01背包问题:在指定数组中挑选任意组合,让它们的和等于一个特定值,列出所有组合方式
* 使用动态规划方法解决,状态转移方程:dp[i][j]=dp[i-arr[j]][j-1].add(arr[j])
*
*/
public class FindComineEqualSum {
public static void main(String[] args) {
int[] arr = { 1, 3, 5, 7, 8, 9, 10, 2, 4, 6 };
int sum = 11;

Set<String> combines = findCombine(arr, sum);

for (String combine : combines) {
if (combine != null) {
System.out.println("the result is:" + combine);
}
}
}

private static Set<String> findCombine(int[] arr, int sum) {
Set<String> result = new HashSet<String>();
Set<String>[][] dp = new HashSet[sum + 1][arr.length + 1];
int i = 0, j = 0;
for (j = 0; j < arr.length + 1; j++) {// 当求和为0时,初始化为"";非常重要,这是动态规划数组产生合理组合的基础.
dp[0][j] = new HashSet<String>();
dp[0][j].add("");
}

for (i = 1; i <= sum; i++) {
for (j = 1; j <= arr.length; j++) {
for (int k = 0; k <= j - 1; k++) {
if (dp[i][k] != null && dp[i][k].size() > 0) {
if (dp[i][j] == null) {
dp[i][j] = new HashSet<String>();
}
dp[i][j].addAll(new HashSet<String>(dp[i][k]));
}
}

if (i >= arr[j - 1] && dp[i - arr[j - 1]][j - 1] != null) {
if (dp[i][j] == null) {
dp[i][j] = new HashSet<String>();
}

for (String str : dp[i - arr[j - 1]][j - 1]) {
dp[i][j].add(str + "," + arr[j - 1]);
}
}
}

// readArray(dp);
}

for (Set<String> Set : dp[sum]) {
if (Set != null) {
result.addAll(Set);
}
}

return result;
}

private static void readArray(String[][] dp) {
for (String[] arr : dp) {
for (String str : arr) {
System.out.print(str + "/");
}
System.out.println();
}
System.out.println("end");

}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值