知恵袋で見つけた赤玉と白玉の組分けの問題をJavaで解いてみました。
赤玉7個と白玉5個をA,B,C の三つのはこに入れる
(1) 赤玉7個と白玉5個を3つの箱に入れる入れ方。ただし空の箱があってもよいとする
(2) 空箱を許さないとき赤玉7個と白玉5個を3つの箱に入れる入れ方
重複組合せの応用問題のようです。丸(○)と仕切り(|)の同じものを含む順列のやり方を使ってみました。(^_^;
ちなみに、(1)を高校の数学で解けば、次の通りです。(^_^;
※参考URL
●組み分け全パターン
● RepeatedComb1.java
/* * RepeatedComb1.java * */ class RepeatedComb1 { // 順列生成 static boolean nextPerm(char[] p, int n, int r) { int i, j; char t; if(r <= 0 || n < r) return(false); 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); } return(true); } public static void main(String[] args) { final String R="赤赤赤赤赤赤赤||"; // 昇順ソート済み final String W="白白白白白||"; // 〃 char[] r = R.toCharArray(); // 順列生成用 char[] w = W.toCharArray(); // 〃 int iCnt1 = 0, iCnt2 = 0; long tm=System.nanoTime(); // Timer Start do{ //--- r loop ---// w = W.toCharArray(); do_cont: do{ //--- w loop ---// iCnt1++; String[] rABC = new String(r).split("|",-1); String[] wABC = new String(w).split("|",-1); for(int i = 0; i< 3; i++) if((rABC[i]+wABC[i]).equals("")) continue do_cont; // チェックを潜り抜けたものだけをカウント iCnt2++; }while(nextPerm(w,7,7)); }while(nextPerm(r,9,9)); System.out.println("(1) "+iCnt1); System.out.println("(2) "+iCnt2); tm=System.nanoTime()-tm; // Timer Stop System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9); } }
●実行結果
(1) 756 (2) 615 Runtime : 0.037 [sec]
※参考URL
●知恵袋で見つけた赤玉と白玉の組分けの問題をJavaで解いてみた。(2)
- 作者: 中山清喬,国本大悟
- 出版社/メーカー: インプレス
- 発売日: 2011/10/07
- メディア: 単行本(ソフトカバー)
- 購入: 6人 クリック: 28回
- この商品を含むブログ (24件) を見る
- 作者: 川場隆
- 出版社/メーカー: 秀和システム
- 発売日: 2009/10/23
- メディア: 単行本
- 購入: 14人 クリック: 162回
- この商品を含むブログ (33件) を見る