• ベストアンサー

組み合わせの作り方

zozyの回答

  • ベストアンサー
  • zozy
  • ベストアンサー率60% (20/33)
回答No.2

少々、適当なアルゴリズムですが、一応動くので参考にしてください。 無駄があるので、良いアルゴリズムではありませんが... public class Main { public static void main(String[] args) { Test test = new Test(4); } } class Test{ // 組み合わせの整数を格納する配列 int[] array; // 整数の種類の数(整数の桁) int digit; // 配列のインデックス int count = 0; public Test(int digit){ // arrayの長さ int arrayLength = 1; // 探索する範囲 int searchLength = 1; int tmp; // 局所変数digitをフィールド変数digitへ代入 this.digit = digit; for(int i=1;i<=digit;i++){ // arrayの長さを計算(digit!) // 例.digit=4なら4*3*2*1=24 arrayLength *= i; // 探索する範囲を計算((digit+1)のdigit乗) // 例.digit=4なら5の4乗=3125 searchLength *= (digit + 1); } // arrayを生成 array = new int[arrayLength]; // 組み合わせの数を探索し、結果をarrayへ代入 for(int i=1;i<searchLength;i++){ tmp = ternary(i); if(tmp > 0){ array[count] = tmp; System.out.println(array[count]); count++; } } // arrayの内容を表示 for(int i:array){ System.out.println(i); } } // 10進数からdigit進数に変換 // 例.digit=4なら4進数へ変換 private int ternary(int num){ String result = ""; while(num > 0){ result += num % (digit + 1); num /= (digit + 1); } result = new StringBuffer(result).reverse().toString(); // 組み合わせの数に相応しければそのまま // 相応しくなければ-1を返す // -1の場合arrayには代入されない if(checkRepetition(result)){ return Integer.parseInt(result); }else{ return -1; } } // 0を含んでいたり、数字が重なってないか判定 private boolean checkRepetition(String str){ boolean repetition = true; // 桁が足りなくないか if(str.length() < digit){ repetition = false; } // 0を含んでないか if(repetition){ for(int i=0;i<str.length();i++){ if(str.charAt(i) == '0'){ repetition = false; break; } } } // 数字が重なってないか if(repetition){ ESC: for(int i=0;i<str.length()-1;i++){ for(int j=i+1;j<str.length();j++){ if(str.charAt(i) == str.charAt(j)){ repetition = false; break ESC; } } } } return repetition; } }

関連するQ&A

  • 組み合わせ

    x≧y≧z>0 x+y+z=2008 を満たす整数の組(x,y,z)の個数を求めたいのですが、 自分で一応やってみて 336005 となりましたが本当にこれであっているのか自信がありません。 どなたかあってるのか確認していただけないでしょうか。 また、その解法も教えてくれると助かります。

  • 組み合わせ

    x+y+z=7 を満たす負でない整数x,y,zの組は??通りある。という問題があります。対称性を使う?とかでよくわかりません。類題では「仕切り」があると考えたりといまいち解き方がわかりません。詳しい解き方を教えてください。

  • 数学(組合せ)の質問です。

    数学(組合せ)の質問です。 問:x+y+z=15の正の整数解は何通りあるか。 解:x-1=X、y-1=Y、z-1=Zとおくと、X≧0、Y≧0、Z≧0   また、x+y+z=15より、(X+1)+(Y+1)+(Z+1)=15   よって、X+Y+Z=12、X≧0、Y≧0、Z≧0 ……(1)   求める正の整数解の個数は、(1)を満たす整数解(X,Y,Z)の個数に等しい。   これはX,Y,Zから、重複を許して12個取る組合せの総数に等しいので、     3H12=3+12-1C12=14C12=14C2=91(通り) という問題があるのですが、いまいちよく理解できません。 そもそも何のためにx-1=Xとおくのかも分かりません。 あと、  > 求める正の整数解の個数は、(1)を満たす整数解(X,Y,Z)の個数に等しい。  > これはX,Y,Zから、重複を許して12個取る組合せの総数に等しいので、 というのもよく分かりません… 初歩的な質問ですが、どなたか教えてください。 よろしくお願いします。

  • たすけてください。組み合わせの問題

    みなさま・・・お力をおかしください。 整数X、Y、ZがX+Y+Z=20、X>1、Y>2、Z>3を満たすとき 、X、Y、Zの組の総数は? お願いします。どうかお力添えを

  • 重複組合せの問題

    重複組合せの問題です。 問題集の解説を読んでも理解できません…。 どなたか教えてください。 --------------------------------------------------------------------------- x+y+z=11の解のうち、次の条件を満たすx,y,zの組(x,y,z)は全部で何組あるか。 (1)x,y,zは、すべて0以上の整数 (2)x,y,zは、すべて正の整数 ---------------------------------------------------------------------------- すみませんがよろしくお願いします。。

  • 順列組合せの問題を教えてください。

    整数x,y,zに対して、x+y+z=15が成り立っているとき、 次の条件をみたすx,y,zの値の組の個数を求めよ。 という問題で 1)x,y,zがすべて自然数である。 は、 15個の○を2本の|で3つの区間に分け、この区間に含まれる○の数を左からx,y,zとすると、 x,y,zがすべて自然数になるのは、○と○の間14ヶ所の中から2ヶ所を選んで|を入れる場合であるので  14C2=14*13/2*1=91(個)…答え 2)x,y,zがすべて0以上の整数である。 は、 1)で考えた○15個と|2本の17個のうち、同じもの15個と2個を含む順列と考えればよいので、   17!/15!*2!=17*16/2*1=136(個)…答え というように15個の○と2本の|を使って一応解いてみたのですが 3)x,y,zがすべて-1以上の整数である。 というものは解法がわかりません。 ご指導のほどをよろしくお願いします。

  • 重複組み合わせ

    x+y+z=21,1≦x≦10,1≦y≦10,1≦z≦10をみたす整数x,y,zの組は何通りあるか。 わからなかったので解答を見たのですが、わからなかったので質問させていただきます。 解答では、 X=10-x,Y=10-y,Z=10-zとして X+Y+Z=9 0≦X,Y,Z≦9      として、以下続いていきます。 なぜこのようになるのかが理解できません。考えれば考えるほどこんがらがってしまいました。重複組み合わせは理解しているつもりなのですが、重複組み合わせにいたるまでのこの過程で詰まっています。 典型的な問題なのでしょうが・・・分かりやすい解説をお願いします。

  • 高校数学A 重複組み合わせ

    x+y+z=8を満たす次のようなx、y、z、の組は何通りあるか。 (1)x、y、zは負でない整数 (2)x、y、z、は自然数 (1)は解けました。 なので(2)の解き方を分かり易く教えてください! 負でない整数と自然数の違いを、 どう考慮して式を立てればいいのかがわかりません!

  • 組み合わせ問題のアルゴリズム

    あらかじめ用意された整数を足して、その合計がある指定された整数と等しくなる組み合わせの数を調べるプログラムを書こうとしているのですが、苦労しています。 具体例がないと伝わりにくいかもしれないので例をあげると、 例えばあらかじめ用意された整数というのが 1・1・2・2・5・8 の4つで、 指定された整数が10である場合は、 8と2 8と1と1 5と2と2と1 という3通りの組み合わせがあるので、3を出力したいというわけです。 今まではもっと単純なアルゴリズムしか考えてこなかったので、こういった組み合わせのような問題が難しく感じられます。 こういう場合、アルゴリズムはどのようなものが考えられるでしょうか。 よろしくお願いします。

  • 整数の選択

    アルゴリズムに関する質問です. n個の相異なる整数が配列 A[1..n] に格納されていて,その配列の中からk番目に小さい整数を選ぶ問題のアルゴリズムを考えています.kは 1<=k<=n を満たす自然数であり,この選択問題は O(n) で解けるものです. ヒープを使ったりして考えたのですがうまくいきません.どなたかこのアルゴリズムを教えてください.よろしくお願いします.