- ベストアンサー
プログラミングで組み分けを作成する方法
- プログラムを作成する際、指定した閾値を超える組を同じグループに分ける方法を教えてください。
- 組の数が一番少なくなるようにグループを作るプログラムの動作イメージを教えてください。
- プログラムのサンプルコードを提供しますが、組の作成方法につまってしまっており、どのように改善すれば良いか教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
データは5個だけでしょうか 5個をグループ分けする組み合わせの数は 5個全部が1グループになる:1通り 4個と1個の2グループになる:5通り 3個と2個の2グループになる:5C2=10通り 2個と2個と1個の3グループになる:5C2x3C2=30通り 2個と1個と1個と1個の4グループになる:10通り 1個ずつ5グループになる:1通り 合わせて57通りですね それほど多くないので、グループ数の少ないほうからすべての組み合わせについて当てはまるかどうかを検査すればよいのではないでしょうか。
その他の回答 (4)
- nag0720
- ベストアンサー率58% (1093/1860)
#1さんの方法は5個の振り分け方の数ですが、5個中4個だけしか選ばれない場合もあるので、 4個、3個、2個の場合の振り分け方も必要になります。 それはそれとして、 この質問は言語は違いますが少し前の質問に似ています。 http://okwave.jp/qa/q7621154.html このときの質問は、どの2つを選んでもOKとなる組み合わせを求める質問でした。 今回の例で言えば、 例1:01,02,12,34 は、 0,1,2 3,4 例2:01,02,03,12,34 は、 0,1,2 0,3 3,4 例3:01,02,34 は、 0,1 0,2 3,4 という組み合わせを求めるアルゴリズムです。 ここまでできればあとは重複している数字があったとき、どちらを選ぶかだけの問題になります。 例1は重複している数字がないので、そのまま。 例2は重複している数字は0と3ですが、0,1,2と3,4のほうを選べば0,3の組が消えます。 例3は重複している数字は0だけですが、どっちを選んでも同じ。 そのロジックはそんなに難しくはないでしょう。
お礼
ありがとうございます。 このようなものがあるのですね。 いま行なっている手法が終わりましたら、こちらの方でもコーディングしてみたいと思います。
- akayoroshi
- ベストアンサー率50% (46/91)
3個と1個と1個の3グループになる:5C2=10通り が抜けていました。#3の42通りと合わせて52通りになります。
- akayoroshi
- ベストアンサー率50% (46/91)
組み合わせの数を間違えていました 誤:2個と2個と1個の3グループになる:5C2x3C2=30通り 正:2個と2個と1個の3グループになる:5C2x3C2/2!=15通り 合計は42通りでしょうか。 ところで、 #1のお礼の場合分けには 4個と1個の2グループになる:5通り が抜けているようです。 〉 データ数を柔軟に変更することが可能な手法がありましたら引き続きご教授ください。 グループ分けの組み合わせを作り出してそれに適合するかどうかを検査するプログラムが作れるのではありませんか。
お礼
ありがとうございます。 みなさんのご指摘の通り52通りとなりました。 >グループ分けの組み合わせを作り出してそれに適合するかどうかを検査するプログラムが 作れるのではありませんか。 なるほど。ただ、7つの時は量が多くなりそうで大変かなと。 その手法でやってみたいと思います。 ありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
5つの場合だと「源氏香」と同じなので合計 52通りになるはずです. #1 は 3グループにわかれるときの計算を間違えてます (数えわすれと数え過ぎの両方がある). で, 各グループに対し「そのグループに入っているデータ (A とか B とか)」を覚えておくと「そのグループに入れていいかどうか」の判定が簡単になるはず. 一般には彩色問題ですね.
お礼
源氏香というものを初めて聞きました。 こういうものがあるのですね、面白かったです。
お礼
データ数が5つの場合はif文で処理することでできました! 場合の数は57通りとはなりませんでしたが、おそらく見落としはないと思います。 ありがとうございます。 もし、データ数を柔軟に変更することが可能な手法がありましたら引き続きご教授ください。 よろしくお願い致します。 //1グループ ABCDE //2グループ //AB,CDE //AC,BDE //AD,BCE //AE,BCD //BC,ADE //BD,ACE //BE,ACD //CD,ABE //CE,ABD //DE,ABC //3グループ //AB,CD,E //AB,CE,D //AB,DE,C //AC,BD,E //AC,BE,D //AC,DE,B //AD,BC,E //AD,BE,C //AD,CE,B //AE,BC,D //AE,BD,C //AE,CD,B //BC,DE,A //BD,CE,A //BE,CD,A //CD,BE,A //CE,BD,A //DE,BC,A //4グループ //AB,C,D,E //AC,B,D,E //AD,B,C,E //AE,B,C,D //BC,A,D,E //BD,A,C,E //BE,A,C,D //CD,A,B,E //CE,A,B,D //DE,A,B,C //5グループ //A,B,C,D,E
補足
回答ありがとうございます。 データ数は初めは5つで考えております。 成功したら7つに増やす予定ですが。 なるほど、全ての場合分けをグループ数の少ない順にやっていき、当てはまった時点でループを終了させてしまうという事ですね。 プログラムをうまく書けるかわかりませんが、今からその方法で考えてみます。 しかし、データ数を柔軟に変更することが難しそうですので、その他の手法などがありましたらご教授ください。 よろしくお願いします。