从一个数租 double[m] arrayXp中,选取n个元素相加(n<=m),列出所有结果。
请问那位有好的算法?

解决方案 »

  1.   

    private void mn(int m, int n) {
    if(m < n)
    throw new IllegalArgumentException("Error m < n");
    int[] array = new int[m];
    for(int i = 0; i < m; i ++)
    array[i] = i + 1;
    BitSet bs = new BitSet(m);
    for(int i = 0; i < n; i++)
    bs.set(i, true);
    do {
    printAll(array, bs);
    }while(moveNext(bs, m));

    }
    private boolean moveNext(BitSet bs, int m) {
    int start = -1;
    while(start < m)
    if(bs.get(++start))
    break;
    if(start >= m)
    return false;

    int end = start;
    while(end < m)
    if(!bs.get(++end))
    break;
    if(end >= m)
    return false;
    for(int i = start; i < end; i++)
    bs.set(i, false);
    for(int i = 0; i < end - start - 1; i++)
    bs.set(i);
    bs.set(end);
    return true;
    }
    private void printAll(int[] array, BitSet bs) {
    StringBuffer sb = new StringBuffer();
    for(int i = 0; i < array.length; i++)
    if(bs.get(i))
    sb.append(array[i]).append(',');
    sb.setLength(sb.length() - 1);
    System.out.println(sb);
    }
    public static void main(String[] args) throws Exception {
    new TestA().mn(8, 3);
    }
    这个是组合,排列可以在选取出来后再计算一次这个数列中的所有可能