タイトル : Re^9: 組み合わせ合計検索 つづき 投稿日 : 2023/08/19(Sat) 18:57 投稿者 : 魔界の仮面弁士
No.12102 のコードでは、近似値設定 (No.12128 でいうところの★値) が 20 なので、 n と合致する値が無い場合、n-1, n-2, n-3, ……, n-20 に合致する組み合わせを捜索するものですね。 > 以下は > No.12102 のコードをどのように変更すれば確認できますでしょうか? Sub Main() の中身を書き換えるだけで確認できますよ。 Dim 値一覧3 As Integer() = {36, 40, 45, 51, 55, 65, 69, 76, 82, 98, 106, 108, 115, 116, 118, 119, 123, 129, 133, 139, 148, 159, 163, 165, 184, 186} For n = 1220 To 1250 探索(n, 値一覧3) Next No.12102 のロジックでは、 探索(7, New Integer() {1, 3, 5}) に対しては、 『設定値:7 合計値:6 詳細値:1, 5』 という結果が得られます。 この出力の意味とは、 「n の値として 7 が設定された」 「合計が 7 になる組み合わせは見つからなかったが、合計 6 になる組み合わせは発見できた」 「その組み合わせとは 1 と 5 である」 です。 これが探索 (1220, 値一覧3) になった場合は、 『設定値:1220 合計値:1220 詳細値:36, 40, 45, 51, 55, 65, 69, 76, 82, 98, 106, 108, 118, 123, 148』 という結果が取得されていますよね。つまり、 「n の値として 1220 が設定された」 「合計が 1220 になる組み合わせが見つかった」 「その組み合わせとは 36, 40, 45, 51, 55, 65, 69, 76, 82, 98, 106, 108, 118, 123, 148 である」 という意味を持っています。 それを簡略化するために、先の No.12129 においては >> 1220 = 36+40+45+51+55+65+69+76+82+98+106+108+118+123+148 という表現に書き換えたに過ぎません。 もし、出力結果を直接、上記の足し算表記へ書き換えたいという話であれば Console.WriteLine("{0} = {1}", 結果.Sum(), String.Join("+", 結果.Select(Function(寸法) CStr(寸法)))) にすれば OK です。 ちなみに No.12129 において >> 「値一覧3」を対象にする場合の組み合わせは >> 合計が 1226 になる組み合わせは 72,832 通り >> 合計が 1230 になる組み合わせは 73,221 通り という投稿をしておりますが、こうした組み合わせ数は、No.12104 あるいは No.12105 にて調べられます。 たとえば、『反復探索(1226, 1226, 値一覧3)』とすれば、合計 1226 になる組み合わせを延々と捜索し、 その最後に「総計 72832 件の組み合わせを抽出しました。」という結果を表示するようになっています。 > No.12102 の元コードを理解しようと見ていたのですが > 私にとってハードルがとても高いようです。。 やっぱり、他人の書いたコードを読むのは難しいですよね……! 必要であれば説明しますが、不明点というのが「VB の文法段階で理解できていない」という事なのか、 それとも「文法は分かるけれど、コードの意味というか探索ロジックが理解できない」という話なのかで 回答も変わってきてしまいます。もしも可能であれば「どこが分からないのか」を説明いただけると 追加解説を加えやすいです。 |