tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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 の文法段階で理解できていない」という事なのか、
それとも「文法は分かるけれど、コードの意味というか探索ロジックが理解できない」という話なのかで
回答も変わってきてしまいます。もしも可能であれば「どこが分からないのか」を説明いただけると
追加解説を加えやすいです。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。