
a1~a10を1以上5以下の整数とするとき、
a1+a2+a3+a4+a5+a6+a7+a8+a9+a10=20
となるような組み合わせは、
(5,5,3,1,1,1,1,1,1,1)→10!/(2!*7!) =360通り
(5,5,2,2,1,1,1,1,1,1)→10!/(2!*2!*6!)=1260通り
(5,4,4,1,1,1,1,1,1,1)→10!/(2!*7!) =360通り
(5,4,3,2,1,1,1,1,1,1)→10!/(6!) =5040通り
(5,4,2,2,2,1,1,1,1,1)→10!/(3!*5!) =5040通り
(5,3,3,3,1,1,1,1,1,1)→10!/(3!*6!) =840通り
(5,3,3,2,2,1,1,1,1,1)→10!/(2!*2!*5!)=7560通り
(5,3,2,2,2,2,1,1,1,1)→10!/(4!*4!) =6300通り
(5,2,2,2,2,2,2,1,1,1)→10!/(6!*3!) =840通り
(4,4,4,2,1,1,1,1,1,1)→10!/(3!*6!) =840通り
(4,4,3,3,1,1,1,1,1,1)→10!/(2!*2!*6!)=1260通り
(4,4,3,2,2,1,1,1,1,1)→10!/(2!*2!*5!)=7560通り
(4,4,2,2,2,2,1,1,1,1)→10!/(2!*4!*4!)=3150通り
(4,3,2,2,2,2,2,1,1,1)→10!/(2!*7!) =360通り
(4,2,2,2,2,2,2,2,1,1)→10!/(2!*7!) =360通り
(3,2,2,2,2,2,2,2,2,1)→10!/(8!) =90通り
(2,2,2,2,2,2,2,2,2,2)→10!/(10!) =1通り
で合計41,221通りだと思います。
ごの、41,221通りの組合せを、エクセルシートに
41,221行20列の範囲に漏れなく出力したいのですが、
VBAで上手いテクニックがあれば教えてください。
よろしくお願いいたします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
なんらかの方法で全ての組合せが得られたとして、その後どのように
その大量のデータを使うのでしょうか。そちらの方が心配です。
目的にもよりますが通常は全ての組合せが必要なケースは少ないと
思います。
最終目的を書かれれば皆さんのアドバイスも的確になるでしょう。
No.3
- 回答日時:
上手いって何なんでしょうか。
観点は速度、保守、汎用性、いろいろあります。全体の組み合わせから不要なパターンを除く
DO-LOOPやIF
各桁の必要な組み合わせパターンの積み重ね
FORーNEXT多重
のどちらか。
5進数の考え方、組み合わせ数の求め方、n!は四則演算式でどうなるか、等を学習すればいいのでは?。
セルを操作しながら、ならOFFSETとか。
機能要件が明確ですしセル操作の類の命令書くだけでは?。あふれあれば5分割すればいい。
No.2
- 回答日時:
(4,3,2,2,2,2,2,1,1,1)の計算が間違っているし、
(4,3,3,3,2,1,1,1,1,1)や(3,3,3,3,3,1,1,1,1,1)などの組み合わせの漏れがありますね。
合計は72,403通りです。
下記のコードでできますが、Excel2007以降でないと行数の制限をオーバーしてしまいます。
Excel2003で実行するなら、シートを分けるなりして分割すれば可能でしょう。
Sub Test()
Cells.Select
Selection.ClearContents
Range("A1").Select
n0 = 0
n = 1
For i = 1 To 7
Cells(n, i) = 1
Next
Cells(n, 8) = 3
Cells(n, 9) = 5
Cells(n, 10) = 5
Do
IsOK = (Cells(n, 10) > 1)
k = 9
Do While k > 0
If Cells(n, k) < 5 And IsOK Then
n = n + 1
p = 0
For i = 1 To 10
If i < k Then
Cells(n, i) = Cells(n - 1, i)
ElseIf i = k Then
Cells(n, i) = Cells(n - 1, i) + 1
ElseIf 20 - p - 5 * (10 - i) < 2 Then
Cells(n, i) = 1
Else
Cells(n, i) = 20 - p - 5 * (10 - i)
End If
p = p + Cells(n, i)
Next
Exit Do
End If
IsOK = (IsOK Or (Cells(n, k) > 1))
k = k - 1
Loop
Loop While k > 0
End Sub
No.1
- 回答日時:
こんな趣味みたいな課題に付き合いたくないが、
プログラムで、初歩的にやるなら、ForNextループを10重にネスト(For a1=1 to 5,For a2=1 to 5・・・Next a1、Next a2・・・)
にすればできるはず。
組み合わせの問題は手作業より計算が速いと言うだけで、良いアルゴリズムは無いのではないか。
近似値でよいタイプの値の算出は、色々とXX法がありうるが。
ーー
もっとスマートな方法は(多分無いと思うが)数学のカテゴリにするものだよ。
そういうアイデアは並みの文系のプログラマには(VBAの経験は相当あっても)聞いても判らないだろう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
あああ..ああい..ああう とい...
-
日付け関数について
-
エクセルで選択したセルがディ...
-
【マクロ】実行時エラー '424':...
-
エクセルで離れた列を選択して...
-
「段」と「行」の違いがよくわ...
-
VBA 別ブックからコピペしたい...
-
エクセルで複数のシートのクリ...
-
特定の色のついたセルを削除
-
Excel UserForm の表示位置
-
Worksheets メソッドは失敗しま...
-
【Excel関数】UNIQUE関数で"0"...
-
指定値をマクロで検索&シート移動
-
Excelで、あるセルの値に応じて...
-
エクセルでセルをクリックする...
-
VBA 空白行に転記する
-
B列の最終行までA列をオート...
-
エクセル 上下で列幅を変えるには
-
マクロの「SaveAs」でエラーが...
-
別ブックをダイアログボックス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
あああ..ああい..ああう とい...
-
VBAにて『元に戻すボタン』を作...
-
select caseの入れ子
-
エクセルで選択したセルがディ...
-
配列の値を保持しながら要素を...
-
プログラムの記述方法について
-
VBAバーコード照合 バーコード...
-
VBAにて文字列の長さを取得...
-
1つのテーブルに重複している列...
-
VBAについて
-
vbs 文字位置を中央に
-
エクセルVBAのプログラム
-
VBA コード エラー対処
-
最大値が0b100である3bit同士の...
-
xlookup関数の引数を利用して検...
-
すべての組合せをシートに出力...
-
targetでクリックしたら○
-
アセンブラでの記述について教...
-
エクセルで簡単なオートシェイ...
-
指数関数近似を行うプログラム...
おすすめ情報