现在的位置: 首页 > 综合 > 正文

找出数组中满足条件的所有组合!

2013年05月26日 ⁄ 综合 ⁄ 共 1171字 ⁄ 字号 评论关闭

 /**
     * 任意给一数组,如{-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#代码!

抱歉!评论已关闭.