同じものを含む組合せの質問をJavaで解いてみた。

 同じものを含む組合せの質問Javaでプログラムを作って解いてみました。(^_^;
 組み合わせの生成では、順列を生成して、昇順になっていないものをスキップしているだけですが、前回のと違って、同じものを含んでいても大丈夫です。
 後半無駄にスキップしているはずなので、もうちょっと工夫すれば、もう少し速くなると思います。(^_^;

●GenComb.java

/*
 * GenComb.java
 * 
 */

import java.util.Arrays;

class GenComb {
    static boolean isAscending(char[] p,int m) {
        for(int i=0; i< m-1; i++)
            if(p[i]> p[i+1]) return(false);
        return(true);
    }
    
    static void swap(char[] s, int i, int j) {
        char t = s[i]; s[i] = s[j]; s[j] = t;
    }
    
    static boolean next_comb(char[] p, int n, int r) {
        int i, j, k;
        if(r <= 0 || n < r) return(false);
        do{
            for(i = r + 1; i <= n-1; i++)
                for(j = i; j >= r + 1 && p[j-1] < p[j]; j--)
                    swap(p,j,j-1);
            for(i = n - 1; i > 0 && p[i-1] >= p[i]; i--);
            if(i==0) return(false);
            for(j = n - 1; j > i && p[i-1] >= p[j]; j--);
            swap(p,j,i-1);
            for(j = n - 1; i < j; i++, j--)
                swap(p,i,j);
        } while(!isAscending(p,r));
        return(true);
    }
    
    static String sSort(String s) {
        char[] c=s.toCharArray();
        
        Arrays.sort(c);
        return(new String(c)); 
    }
    
    public static void main(String[] args) {
        final String BALL=sSort("白白赤赤赤青青青青");    // 念のためのソート
        final int N=BALL.length();
        final int R= 5;
        char[] ball=BALL.toCharArray();
        
        long tm=System.nanoTime();      // Timer Start
        int count=0;
        
        do{
            count++;
            System.out.println(new String(ball).substring(0,R));
        }while(next_comb(ball,N,R));
        System.out.println("計: "+count);
        tm=System.nanoTime()-tm;        // Timer Stop
        System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9);
    }
}

●実行結果

白白赤赤赤
白白赤赤青
白白赤青青
白白青青青
白赤赤赤青
白赤赤青青
白赤青青青
白青青青青
赤赤赤青青
赤赤青青青
赤青青青青
計: 11
Runtime : 0.003 [sec]

P.S.
 ちなみに、isAscendingとswapとnext_combメソッドを1つにまとめると、次のようになります。(^_^;

    // 組合せ生成
    static boolean next_comb(char[] p, int n, int r) {
        int i, j;
        char t;
        
        if(r <= 0 || n < r) return(false);
        do{
            for(i = r + 1; i <= n-1; i++)
                for(j = i; j >= r + 1 && p[j-1] < p[j]; j--){
                    t = p[j]; p[j] = p[j-1]; p[j-1] = t;    // swap(p,j,j-1);
                }
            for(i = n - 1; i > 0 && p[i-1] >= p[i]; i--);
            if(i==0) return(false);
            for(j = n - 1; j > i && p[i-1] >= p[j]; j--);
            t = p[j]; p[j] = p[i-1]; p[i-1] = t;            // swap(p,j,i-1);
            for(j = n - 1; i < j; i++, j--){
                t = p[i]; p[i] = p[j]; p[j] = t;            // swap(p,i,j);
            }
            for(i = 0; i< r-1; i++)
                if(p[i]> p[i+1]) break;
        } while (i< r-1);
        return(true);
    }

明解Javaによるアルゴリズムとデータ構造

明解Javaによるアルゴリズムとデータ構造

プログラミングの宝箱 アルゴリズムとデータ構造 第2版

プログラミングの宝箱 アルゴリズムとデータ構造 第2版

定本Javaプログラマのためのアルゴリズムとデータ構造

定本Javaプログラマのためのアルゴリズムとデータ構造