私はいくつかのアルゴリズムプログラミングの問題に取り組んできましたが、1つについて質問があります。問題は、この質問で参照されているものと同じです。USACO:サブセット(非効率的)
高Nには遅すぎるいくつかの(動的ではない)ソリューションをコーディングすることができました。少しごまかして、オンラインでいくつかのソリューションを検索する必要がありました。高速アルゴリズムは簡単ですが、答えを知っていても、問題から答えに至る方法がわかりません。等しい合計のサブセットが形成される方法でパターンを見ることができますが、それらのパターンとアルゴリズムソリューションの間のリンクはわかりません。
問題(上記のリンク)は次のとおりです。
1からN(1 <= N <= 39)までの連続する整数のセットが与えられた場合、合計が同じである2つのサブセットにセットを分割できる方法はいくつありますか?たとえば、{1,2,3}は一方向に分割できます:{1,2}{3}。
より大きなセットの場合、答えは0(N *(N + 1)/ 2が奇数の場合)であるか、次の単純なアルゴリズムによって与えられます。
arr = array of int with (N*(N+1)/4)+1 elements
arr[0]=1 // all other elements initialized to 0
for i = 1 to N
for j = N*(N+1) / 4 downto i
add arr[j-i] to arr[j]
subsetpaircount = arr[N*(N+1)/4] / 2
繰り返しになりますが、アルゴリズムがどのように機能するかを確認できます。printステートメントを挿入したので、アルゴリズムがどのように機能するかを「見る」ことができます。アルゴリズムの操作が、2セットのパーティションが生成されるさまざまな方法のパターンにどのようにリンクしているかがわかりません。
リンクされた質問の回答は関連があるかもしれませんが、それがどのように機能するかを接続することもできません:「これは多項式(x ^ 1 + 1 / x)(x ^ 2 + 1 / x ^ 2)...(x ^ n + 1 / x ^ n)。..。 "
誰かが私との関係を明確にしたり、この特定の問題を説明するいくつかの参考資料を教えてもらえますか?ありがとう。