• 締切済み

C言語で重複組合せを全列挙

よろしくお願いします。当方プログラミング初心者です。 ある配列a[]={1,1,2,2,3,3}があります。 この配列の重複組合せを全列挙したいのですが、 どういうプログラムを組めばいいのでしょうか? よろしくお願いします!

みんなの回答

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

その6個の要素から、重複を許して「何個の」要素を取り出したいのですか?

全文を見る
すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4854/10269)
回答No.1

各要素が、「ある」「なし」のすべての組み合わせと言うことですよね。 こんな感じで、intが32bitならaの要素が31個までは出来ると思います。 #include <stdio.h> #include <math.h> main() { int a[]={1,1,2,2,3,3}; #define N (sizeof a/sizeof a[0]) int i,j; for(i=0;i<pow(2,N);i++){ printf("%d:",i+1); for(j=0;j<N;j++){ if(i & 1<<j){ printf("%d ",a[j]); } } printf("\n"); } }

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ※ マクロ問題 順列の列挙 マクロで教えてください

    マクロの初心者です。初心者でも分かるようなシンプルなプログラムで考えていただけませんか?自分なりに組んでみたのですがイマイチ上手く作動しません。色んな書き方があるとは思いますが、色んな考えかた(プログラムの書き方)を聞いてみたいと思って投稿させていただきました。 問1) 10個の中から、6個取る重複順列を列挙するプログラムをマクロで、書くとどうなるでしょうか? 問2) 8個の中から、5個取る重複順列を列挙するプログラムをマクロで、書くとどうなるでしょうか? よろしくお願いします。

  • 配列の重複削除について

    データを作るプログラムで、配列の重複を削除したいのです。 配列の中身は乱数を発生させることで作ります。 内容は、 1 1 1 4 2 8 2 10 3 4 4 3 5 2 6 3 8 2 といった感じです。 ルールは、 *一列目と二列目が同じ数字ではだめ *(2 8)と(8 2)、(3 4)と(4 3)は重複しているので一方を削除 *()はつけない です。 プログラミング初心者なので、全くわかりません。 よろしくお願いします。

  • 重複組み合わせが分からない!

    高校の数Aの確立の範囲に(重複組み合わせ)がありますよね。 そこが分かりません。 Hを使ったり、仕切りを考えたり・・・ 具体的に言うと何を仕切りの基準にするのかが分かりません。 例えば「4個のみかんと6個のりんごから重複を許して3つの皿に分ける」という問題だとしたら、Hのどちら側が10でどちら側が3なのか?? 是非!!重複組み合わせの画期的な解法を教えてください!!

  • 重複組合せ

    重複組合せの問題がどうも理解できないのでお願いします。 問い: 一つのさいころを二回投げて出た目を順にa,bとする時a≧bとなるような目の出 方は何通りあるか。重複組合せの考え方で解け ---- これはどういう風に考えればいいのでしょう。 重複組合せは「○○○○○○と|」という具合に「○の数と頭数-1の仕切」で考えるんですよね。 題意に沿うようにaとbを表に整理すると、 a=1 b=1 a=2 b=1,2 a=3 b=1,2,3 a=4 b=1,2,3,4 a=5 b=1,2,3,4,5 a=6 b=1,2,3,4,5,6 このようになりますが、これを「○の数と頭数-1の仕切」やnHrの形で表すのに どのように考えて良いのか分かりません。 さいころの目は常にn≧1なので、さいころの目を六個のボールと考えて 「aさんが0個のボールを手にするとき、bさんは6個手にすることが出来る」 「aさんが1個のボールを手にするとき、bさんは5個手にすることが出来る」 ・・・ などというようには考えられないのですが・・・。 そもそも重複組合せの私の理解が間違っているのでしょうか。 お願いします。

  • 重複あり総当り組み合わせを作りたい。

    よろしくお願いします。 XPのエクセル2003です。 使う数字は、1234のみの種類を4行と5行と6行の、 重複ありの総当り(可能な限り)の、組み合わせを、エクセルで、できないものか、 試行錯誤しています。 色々web見て回りましたが、重複ありは、なかなかないです。 質問者:moko_1984  ここでも確認しましたが、内容が、少し違うように感じます。 エクセルも初心者ですが、よろしくお願いします。

  • C言語での並び替えのプログラム

    A[6][5]={{"abei"}, {"aceh"}, {"adeg"}, {"aef"}, {"bcfi"}, {"bdfh"}}; と配列があるとします。 (a).A[1][5]の文字列とA[2][5]の文字列を比較して、"abceih"という組み合わせた文字列を作り、その文字列の数を出します(この場合6個)。次に、A[3][5]のA[4][5]を比較して組み合わせて文字列を作り、その文字列の数を出します。A[5][5]とA[6][5]も同じように比較して組み合わせて文字列を作り、その文字列の数を出し、最後にそのすべての数の和を出します。 (b).この配列を並べ変えて(a)をします。 並び替え方は配列6個のとき 1.(1)(2)(3)(4)(5)(6) 2.(1)(2)(3)(5)(4)(6) 3.(1)(2)(3)(6)(4)(5) 4.(1)(3)(2)(4)(5)(6) 5.(1)(3)(2)(5)(4)(6) 6.(1)(3)(2)(6)(4)(5) 7.(1)(4)(2)(3)(5)(6) 8.(1)(4)(2)(5)(3)(6) 9.(1)(4)(2)(6)(3)(5) 10.(1)(5)(2)(3)(4)(6) 11.(1)(5)(2)(4)(3)(6) 12.(1)(5)(2)(6)(3)(4) 13.(1)(6)(2)(3)(4)(5) 14.(1)(6)(2)(4)(3)(5) 15.(1)(6)(2)(5)(3)(4) の15通りになります。 この配列の並びを前から配列を2つずつ取り出して比較すれば全組み合わせが完了したことになります。 この15通りの組み合わせの中で総和が一番少なくなる組み合わせ方を探すプログラムを作りたいのです。 そしてこのとき、配列が最大で40個までとなることがあるとするとその並べ替えのプログラムはどうなるでしょうか? 比較するプログラムは作ることに成功しましたが並べ替えのプログラムがうまく作れません誰か教えていただけないでしょうか?

  • 重複組合わせ

    重複組合わせ ある本に次のような説明がありました。 一つの箱のなかに1からnまでの番号のついた球が入っているとする。この中から球を順にr個取り出すという場合。 取り出した番号は無視してそれらの番号の組を作る。 この場合、n+r-1個からr個取り出す組合せに直す事ができる。 まず、取り出したr個のものa1,a2,…,arに対して、順序を区別しないのであるから、考えやすくするために、n個のものに対応する番号をつけ、取り出したa1,a2,…,arの番号は、a1≦a2≦…≦arであると仮定しても問題無い。そうすると、ここに、順に0,1,2、…、r-1を加え、 a1+0=b1 a2+1=b2 … ar+(r-1)=br を考えれば、b1<b2<…<brであって、しかも、b1,b2,…,brは1,2,3、…、n+r-1のうちのいずれかである。このb1,b2,…,brの取り方は、取り出した順番に関係なく番号が大きい順に並べ直したものだから、n+r-1個からr個取り出す組合せになる。 つまり、nこからr個重複して取り出す組み合わせを、n+r-1こからr個取り出す組合せになおすことができた。 ・・・という説明があるのですが、イマイチよくわかりません゜(゜´Д`゜)゜ どなたかもう少し噛み砕いてわかりやすく説明してくださいませんか?? 回答よろしくお願いします。

  • 組合せと重複組合せの区別がいまいちわかりません

    組合せと重複組合せの区別がいまいちわかりません 教えてください

  • ※ 組み合わせ列挙を機械的に表示する方法?

    10個の数字の中から6個の数字を取り出すとき組み合わせは210通りになると思うのですが、自分で手作業で列挙してみたら209通りにしかなりません。 1~10の数字を小さい順に並べ(1→2→3→4→5→6→7→8→9→10)辞書順になるように列挙してみた。組み合わせの計算だと210通りの組み合わせになるはずなのに209通りにしかなりませんでした。どこかに取りこぼしがあるのだとは思いますが自分で何度も確認したけど、どこが間違っているのか探しきれません。 質問1) 今回は手作業で列挙したのですがパソコンの何らかの機能(エクセルとか?関数とか?)を使ってこの作業(組み合わせの列挙を機械的に表示する方法)をすることはできないでしょうか? 質問2) どこが間違っているのか探して欲しいです。(自分なりに何度も見直しましたが探しけれずに困っています。) 1(1→2→3→4→5→6) 2(1→2→3→4→5→7) 3(1→2→3→4→5→8) 4(1→2→3→4→5→9) 5(1→2→3→4→5→10) 6(1→2→3→4→6→7) 7(1→2→3→4→6→8) 8(1→2→3→4→6→9) 9(1→2→3→4→6→10) 10(1→2→3→4→7→8) 11(1→2→3→4→7→9) 12(1→2→3→4→7→10) 13(1→2→3→4→8→9) 14(1→2→3→4→8→10) 15(1→2→3→4→9→10) 16(1→2→3→5→6→7) 17(1→2→3→5→6→8) 18(1→2→3→5→6→9) 19(1→2→3→5→6→10) 20(1→2→3→5→7→8) 21(1→2→3→5→7→9) 22(1→2→3→5→7→10) 23(1→2→3→5→8→9) 24(1→2→3→5→8→10) 25(1→2→3→5→9→10) 26(1→2→3→6→7→8) 27(1→2→3→6→7→9) 28(1→2→3→6→7→10) 29(1→2→3→6→8→9) 30(1→2→3→6→8→10) 31(1→2→3→6→9→10) 32(1→2→3→7→8→9) 33(1→2→3→7→8→10) 34(1→2→3→7→9→10) 35(1→2→3→8→9→10) 36(1→2→4→5→6→7) 37(1→2→4→5→6→8) 38(1→2→4→5→6→9) 39(1→2→4→5→6→10) 40(1→2→4→5→7→8) 41(1→2→4→5→7→9) 42(1→2→4→5→7→10) 43(1→2→4→5→8→9) 44(1→2→4→5→8→10) 45(1→2→4→5→9→10) 46(1→2→4→6→7→8) 47(1→2→4→6→7→9) 48(1→2→4→6→7→10) 49(1→2→4→6→8→9) 50(1→2→4→6→8→10) 51(1→2→4→6→9→10) 52(1→2→4→7→8→9) 53(1→2→4→7→8→10) 54(1→2→4→7→9→10) 55(1→2→4→8→9→10) 56(1→2→5→6→7→8) 57(1→2→5→6→7→9) 58(1→2→5→6→7→10) 59(1→2→5→6→8→9) 60(1→2→5→6→8→10) 61(1→2→5→6→9→10) 62(1→2→5→7→8→9) 63(1→2→5→7→8→10) 64(1→2→5→7→9→10) 65(1→2→5→8→9→10) 66(1→2→6→7→8→9) 67(1→2→6→7→8→10) 68(1→2→6→7→9→10) 69(1→2→6→8→9→10) 70(1→2→7→8→9→10) 71(1→3→4→5→6→7) 72(1→3→4→5→6→8) 73(1→3→4→5→6→9) 74(1→3→4→5→6→10) 75(1→3→4→5→7→8) 76(1→3→4→5→7→9) 77(1→3→4→5→7→10) 78(1→3→4→5→8→9) 79(1→3→4→5→8→10) 80(1→3→4→5→9→10) 81(1→3→4→6→7→8) 82(1→3→4→6→7→9) 83(1→3→4→6→7→10) 84(1→3→4→6→8→9) 85(1→3→4→6→8→10) 86(1→3→4→6→9→10) 87(1→3→4→7→8→9) 88(1→3→4→7→8→10) 89(1→3→4→7→9→10) 90(1→3→4→8→9→10) 91(1→3→5→6→7→8) 92(1→3→5→6→7→9) 93(1→3→5→6→7→10) 94(1→3→5→6→8→9) 95(1→3→5→6→8→10) 96(1→3→5→6→9→10) 97(1→3→5→7→8→9) 98(1→3→5→7→8→10) 99(1→3→5→7→9→10) 100(1→3→5→8→9→10) 101(1→3→6→7→8→9) 102(1→3→6→7→8→10) 103(1→3→6→7→9→10) 104(1→3→6→8→9→10) 105(1→3→7→8→9→10) 106(1→4→5→6→7→8) 107(1→4→5→6→7→9) 108(1→4→5→6→7→10) 109(1→4→5→6→8→9) 110(1→4→5→6→8→10) 111(1→4→5→6→9→10) 112(1→4→5→7→8→9) 113(1→4→5→7→8→10) 114(1→4→5→7→9→10) 115(1→4→5→8→9→10) 116(1→4→6→7→8→9) 117(1→4→6→7→8→10) 118(1→4→6→7→9→10) 119(1→4→6→8→9→10) 120(1→4→7→8→9→10) 121(1→5→6→7→8→9) 122(1→5→6→7→8→10) 123(1→5→6→7→9→10) 124(1→5→6→8→9→10) 125(1→5→7→8→9→10) 126(1→6→7→8→9→10) 127(2→3→4→5→6→7) 128(2→3→4→5→6→8) 129(2→3→4→5→6→9) 130(2→3→4→5→6→10) 131(2→3→4→5→7→8) 132(2→3→4→5→7→9) 133(2→3→4→5→7→10) 134(2→3→4→5→8→9) 135(2→3→4→5→8→10) 136(2→3→4→5→9→10) 137(2→3→4→6→7→8) 138(2→3→4→6→7→9) 139(2→3→4→6→7→10) 140(2→3→4→6→8→9) 141(2→3→4→6→8→10) 142(2→3→4→6→9→10) 143(2→3→4→7→8→9) 144(2→3→4→7→8→10) 145(2→3→4→7→9→10) 146(2→3→4→8→9→10) 147(2→3→5→6→7→8) 148(2→3→5→6→7→9) 149(2→3→5→6→7→10) 150(2→3→5→6→8→9) 151(2→3→5→6→8→10) 152(2→3→5→6→9→10) 153(2→3→5→7→8→9) 154(2→3→5→7→8→10) 155(2→3→5→7→9→10) 156(2→3→5→8→9→10) 157(2→3→6→7→8→9) 158(2→3→6→7→8→10) 159(2→3→6→7→9→10) 160(2→3→6→8→9→10) 161(2→3→7→8→9→10) 162(2→4→5→6→7→8) 163(2→4→5→6→7→9) 164(2→4→5→6→7→10) 165(2→4→5→6→8→9) 166(2→4→5→6→8→10) 167(2→4→5→6→9→10) 168(2→4→5→7→8→9) 169(2→4→5→7→8→10) 170(2→4→5→7→9→10) 171(2→4→5→8→9→10) 172(2→4→6→7→8→9) 173(2→4→6→7→8→10) 174(2→4→6→7→9→10) 175(2→4→6→8→9→10) 176(2→4→7→8→9→10) 177(2→5→6→7→8→9) 178(2→5→6→7→8→10) 179(2→5→6→7→9→10) 180(2→5→6→8→9→10) 181(2→5→7→8→9→10) 182(2→6→7→8→9→10) 183(3→4→5→6→7→8) 184(3→4→5→6→7→9) 185(3→4→5→6→7→10) 186(3→4→5→6→8→9) 187(3→4→5→6→8→10) 188(3→4→5→6→9→10) 189(3→4→5→7→8→9) 190(3→4→5→7→8→10) 191(3→4→5→7→9→10) 192(3→4→5→8→9→10) 193(3→4→6→7→8→9) 194(3→4→6→7→8→10) 195(3→4→6→7→9→10) 196(3→4→6→8→9→10) 197(3→4→7→8→9→10) 198(3→5→6→7→8→9) 199(3→5→6→7→8→10) 200(3→5→6→7→9→10) 201(3→5→7→8→9→10) 202(3→6→7→8→9→10) 203(4→5→6→7→8→9) 204(4→5→6→7→8→10) 205(4→5→6→7→9→10) 206(4→5→6→8→9→10) 207(4→5→7→8→9→10) 208(4→6→7→8→9→10) 209(5→6→7→8→9→10) 210(→→→→→)??? 以上、よろしくお願いします。

  • 組み合わせの列挙について

    こんばんは。前回質問させて頂いた事 http://oshiete1.goo.ne.jp/qa5506662.html でちょっと数学的な壁にぶつかってしまいました。ここではその部分だけを具体的に質問させて頂きます。 Y と N の2つの文字を7列に並べます Y,Y,Y,Y,Y,Y,Y Y,Y,Y,Y,Y,Y,N Y,Y,Y,Y,Y,N,Y Y,Y,Y,Y,N,Y,Y Y,Y,Y,N,Y,Y,Y この先、2の7乗=128通り、続くと思うのですが、実際に列挙して128通り書いていたら、ややこしくなってしまいました。そこで、全ての組み合わせの列挙をする数学的方法といいますか、何かそういったものはあるのでしょうか?やはり、ひとつずつ書いていくしかないのでしょうか?よろしくお願いします。