M个值的数组中,选取N个数的全排列组合,怎么算?顺序不要求

解决方案 »

  1.   


    求(1...m)中,n个数的组合
    本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标代表的数被选中,为0则没选中。     
       首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。     
       然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合,
       同时将其左边的所有“1”全部移动到数组的最左端。     
       当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得到了最后一个组合。   
      
       例如求5中选3的组合:     
       1    1    1    0    0    //1,2,3  
       1    1    0    1    0    //1,2,4 
       1    0    1    1    0    //1,3,4 
       0    1    1    1    0    //2,3,4  
       1    1    0    0    1    //1,2,5    
       1    0    1    0    1    //1,3,5     
       0    1    1    0    1    //2,3,5    
       1    0    0    1    1    //1,4,5     
       0    1    0    1    1    //2,4,5     
       0    0    1    1    1    //3,4,5   
      

  2.   

    可以看看这个http://topic.csdn.net/u/20110409/12/64df94e9-56cd-4b33-af9c-33814f7a2cce.html
      

  3.   

    for example
    import java.util.*;
    public class Test {    
        public static void main(String[] args) throws Throwable {
            String[] data = {"1", "2", "3", "4", "5"};
            int num = 3;
            List<List<String>> result = parade(Arrays.asList(data), num);
            for (List<String> l : result) {
                System.out.println(l);
            }
            System.out.printf("total:%s\n", result.size());
        }    public static List<List<String>> parade(List<String> data, int num) {
            List<List<String>> result = new ArrayList<List<String>>();
            if (num == 1) { //只排一个元素的时候(递归结束条件)
                for (String s : data) {
                    List<String> l = new ArrayList<String>();
                    l.add(s);
                    result.add(l); //每个元素分别保存到结果集
                }
                return result; //并返回结果集
            }        
            for (int i=0; i<data.size(); i++) { //num>1,即排多个元素的时候,循环
                List<String> list = new ArrayList<String>(data);
                list.remove(i); //去掉当前循环的元素作为下次递归的参数,即剩余的元素做递归
                List<List<String>> sub = parade(list, num-1); //递归调用
                for (List<String> l : sub) { //然后循环递归得到的结果
                    l.add(0, data.get(i)); //把当前元素排在每个结果的前面
                    result.add(l); //并保存到结果集
                }
            }        return result; //最后返回结果集
        }
    }