今DPを勉強中で、AtCoderというサイトでいろいろ問題を解いています
この問題で詰まりました
http://atcoder.jp/contests/abc047/tasks/abc047_a
これ自体は簡単なのですが
子供の数がX人、パックの数がN個になった時にどうなるかと考えてみて、
X >= 3のときにアルゴリズムはわかるが実際にどう書いたら良いか分からなくなりました。
例えばX = 3なら、パックの部分和のキャンディが全部のキャンディの1/3になる組み合わせがあれば
その組み合わせをパックのリストから除外して残ったリストからまたパックの同じように部分和を考えればいいと思います。
X > 3についてもloopを使えばできると思うのですが、具体的にどう書けば良いのでしょうか
###問題自体の解答はこれです
dp[i+1][j] : i番目までのパックからいくつか選んで中のキャンディの総和が全部のキャンディの半分(この問題では子供が二人なので)になるようにすることが可能かどうかの論理知。
dp[i][j]がTrueならdp[i+1][j]もTrue
dp[i][j]がFalseのとき、(j >= packs[i]の場合のみ)dp[i][j-packs[i]]をみてTrueならdp[i+1][j]もTrue
python3
1packs = [int(candies) for candies in input().split()] 2N = int(len(packs)) 3X = 2 4if sum(packs) % X == 0: 5 A = int(sum(packs) / X) # 部分和がAになれば良い 6else: 7 print('No') 8 exit() 9 10dp = [[False] * (A + 1)] * (N + 1) 11dp[0][0] = True 12 13for i in range(N): 14 for j in range(A+1): 15 if dp[i][j]: 16 dp[i+1][j] = dp[i][j] 17 elif j >= packs[i]: 18 dp[i+1][j] = dp[i][j - packs[i]] 19 20if dp[N][A]: 21 ans = "Yes" 22else: 23 ans = "No" 24 25print(ans) 26
追記
i, j に加えて現在のリストの情報kも必要ですよね
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。