ベストアンサー 組み合わせの作り方 2009/09/26 22:47 整数x~yを1回ずつ含んだ配列を作りたいんですが、どうすればいいでしょうか?何かアルゴリズムってありましたっけ? 例えば1~3では 123 132 213 231 312 321 となります みんなの回答 (2) 専門家の回答 質問者が選んだベストアンサー ベストアンサー zozy ベストアンサー率60% (20/33) 2009/09/27 02:10 回答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; } } 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 その他の回答 (1) Tacosan ベストアンサー率23% (3656/15482) 2009/09/26 23:39 回答No.1 よくあるパターンは再帰を使う. 配列を 2個使っていいなら「階乗進法」という謎の技もある. 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピュータープログラミング・開発Java 関連する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個取る組合せの総数に等しいので、 というのもよく分かりません… 初歩的な質問ですが、どなたか教えてください。 よろしくお願いします。 ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム たすけてください。組み合わせの問題 みなさま・・・お力をおかしください。 整数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) で解けるものです. ヒープを使ったりして考えたのですがうまくいきません.どなたかこのアルゴリズムを教えてください.よろしくお願いします. 組み合わせ問題の解説がわかりません w+x+y+z=5を満たす0以上の整数w,x,y,zの組み合わせはいくつあるか。 という問題の解説が w+x+y+z=5なので、5個のものを一列に並べて3つの仕切りを入れると考えると、合計8個を横一列に並べばよいので、8C3=56通りとなる。 とありますが意味が全くわかりません。この解説の意味と、もしくは他にもっと分かりやすい解き方があれば教えてください。 重複組み合わせの問題の記述の仕方 『x+y+z=12を満たす正の整数x、y、zの組(x、y、z)は、全部で何組あるか。』 という問題は、○と仕切りの順列を使って解答することはできますか? "正の整数の組"、"どの種類も少なくとも1個は取る"のタイプだと○と仕切りの順列を使った解答を見かけないのですが、記述が面倒なことになるんでしょうか? 自分としては、「まずx、y、zを1個ずつ取り、残りの9個の取り方を考える。9つの○と2つの仕切りの順列の総数に等しいから…」といった感じに考えるのが一番簡単で慣れてしまっているのですが、きちんとした記述の仕方がわからなくて悩んでいます。 AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム 組み合わせについての質問です。このアルゴリズムは作ることは可能ですか? n個の配列を全ての通り分、並び替えて表示させるアルゴリズムは作ることができるのでしょうか? 可能ならば、教えてください!! 例えば、4個の配列があるとするとその並びは24通りあるのでその24通りを表示させるといったようなものです。 C言語、配列の積 整数型二次元配列x,yに適当な値をキーボードから入力し、次にそれらの行列の積を計算して二次元配列zに代入し、行列x,y,zの要素を出力せよ。但し、配列の大きさは最初にキーボードから入力しておき、変数宣言においては、配列の大きさを大きめに宣言しておき、キーボードから入力する配列の大きさはその範囲内で入力するようにせよ。 という問題です。よろしくお願いいたします 整数型の配列をランダムに並べ替える方法 100ます計算の問題を作る、というプログラムを作ってみようと考えています。 問題となる数列は、1から9までの数字をランダムに並べ替えた物になるはずです。 さて、この「ランダムに並べ替えた数字」というのは、どういったアルゴリズムで作成するのが最適なのでしょうか? 個人的に思いついたのは、以下のような方法です。 1.整数型の配列変数(要素が9個)を作成し、それぞれ1から9まで数字を入れておきます。 2.乱数を使って、「x番目とy番目の数字を入れ替え」という風に、何度も入れ替えを行います。 これだと非常に単純なのですが、正直言って素人の考えなので、最適なのかどうか疑問なのです。 もっと最適な方法があれば教えて頂きたいです。 点列 平面上にとある点(x座標y座標)をあらかじめ(配列で)入力しておき次のプログラムで一つの点(x,y)を入力しさっき入力した点列の中からその点に一番近い点を表示するプログラムなんです。 わかる人教えてください。考え方(アルゴリズム)やプログラムの文そのままでも教えてくれたら嬉しいです。 方程式 この問題のとき方を教えてほしいです。 方程式4x-9y=50を満たす整数Xとyの組(x ,y)の一つが(8、-2)であることを示し、整数解(x,y)を整数kをもちいてあらわせ。 という問題です。 x^4+y^4 x+y, x^2+y^2, x^3+y^3 はみな整数だが x^4+y^4 は整数ではない、をみたすような 実数 x, y の例ってどんなものがありますか? 中学1年生 連立方程式の解き方... 連立方程式の解き方でわからない部分があり、困っています...。 【2けたの正の整数がある。この整数は、各けたの数の和の4倍よりも 3大きい。また、十の位の数と一の位の数を入れ替えた整数は、もとの 整数よりも9大きい。もとの整数を求めよ】 という問題です。十の位の数をx、一の位の数をyとすると、求める整数 は10x+yとなりますよね。よって、以下の連立方程式が出来上がる所 までは理解できます。 10x+y=4(x+y)+3 10y+x=10x+y+9 この後がわかりません。 模範解答によると、上記の式を整理すると、 2x-y=1 x-y=-1 よって、これを解くと、x=2、y=3で、元の整数は23。となっていますが、 そこに至るまでの、 2x-y=1 x-y=-1 はどのように求めたら良いのかわかりません...。加減法?代入法? 頭の中がこんがらがっています。アドバイス頂けたら嬉しいです。 部分和問題がわかりません。 部分和問題がわかりません。 [問題] n個の整数が配列Aに格納されていて、整数xの値を与えたときに、 A[i] + A[j] = x となるi,jが存在するかどうかを判定する、なるべく効率のよいアルゴリズムを示せ。 この問題は部分和問題のため、NP完全問題なので、総当たりのO(n^2)より効率のいい方法がないと思うのですが、もっと効率のよい方法が存在するのでしょうか? 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター プログラミング・開発 Microsoft ASPC・C++・C#CGIJavaJavaScriptPerlPHPVisual BasicHTMLXMLCSSFlashAJAXRubySwiftPythonパフォーマンス・チューニングオープンソース開発SEOスマートフォンアプリ開発その他(プログラミング・開発) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など