import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<KeyValue> kvList = Test.getGroupType(new int[] { 15792, 6768,
13536, 84960, 33840, 222900 });
search(kvList, 263508);
}
/**
* 搜索 和未 count的组合
*
* @param kvList
* @param count
*/
public static void search(List<KeyValue> kvList, int count) {
String s = "";
for (int i = 0; i < kvList.size(); i++) {
if (kvList.get(i).getCount() == count) {
s += Arrays.toString(kvList.get(i).getNums()) + " ";
}
}
System.out.println(count + " 是 " + s + " 的和");
}
/**
* 获取 数字 的组合方式
*
* @param numSet
* @return
*/
public static List<KeyValue> getGroupType(int[] numSet) {
int max = 1 << numSet.length; // 2的 numSet.length次方
String[] ks = new String[max];
ks[0] = "0";
for (int i = 1; i < max; i++) {
String s = "";
for (int j = 0; j < numSet.length; j++) {
if ((i & (1 << j)) != 0) {
s += numSet[j] + ",";
}
}
ks[i] = s;
}
// 排除1个数字的组合
List<KeyValue> list = new ArrayList<KeyValue>();
for (int i = 0; i < ks.length; i++) {
if (ks[i].length() > 2) {
KeyValue kv = new KeyValue();
int count = 0;
String[] x = ks[i].split("[,]");
int[] y = new int[x.length];
for (int j = 0; j < x.length; j++) {
count += Integer.parseInt(x[j]);
y[j] = Integer.parseInt(x[j]);
}
kv.setCount(count);
kv.setNums(y);
list.add(kv);
}
}
return list;
}
}
// 和与 数字的 键值对关系
class KeyValue {
// 几个数的和
private int count;
// 组合数组
private int[] nums;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public int[] getNums() {
return nums;
}
public void setNums(int[] nums) {
this.nums = nums;
}
}