/**
* 任意给一数组,如{-10,45,35,99,10,6,9,20,17,18}
* 再任意给一个值,如35.
* 请从上面的数组中找出所有的组合,使他们的和等于35.
* 例如对于上面的数组,所有的组合情况为:
* 35; -10+45;17+18;6+9+20;-10+35+10;-10+17+18+10;-10+6+9+20+10;
* 注意,每一种组合中一个数只能出现一次。
* 思路:利用排列组合原理 二进制移位实现
* 0000 0000 11 表示第一位arr[0]和第二位arr[1]数相加
*
* @param arr
* @param c
*/
public static void assemble(int[] arr, int c) {
for (int i = 1; i < 1 << arr.length; i++) { //数组集合情况 << 优先级比<大
int temp = 0;
StringBuffer buff = new StringBuffer();
for (int j = 0; j < arr.length; j++) {
if ((i & 1 << j) != 0) { //1 << j 在数组中移动, (i & 1 << j) != 0 判断数组的集合 情况。
temp += arr[j];
buff.append(arr[j]).append(",");
}
}
if (temp == c) {
System.out.println(buff.toString().substring(0, buff.length() - 1));
}
}
}
测试:
public static void main(String[] arg0) {
System.out.println(System.currentTimeMillis());
int[] array={17,18,-10,45,35,99,10,6,9,20};
Assemble.assemble(array,35);
System.out.println(System.currentTimeMillis());
}
结果:
1236673202015
17,18
-10,45
35
17,18,-10,10
-10,35,10
6,9,20
-10,10,6,9,20
1236673202031
思路:利用排列组合原理 二进制移位实现
思路来源: 一段C#代码!