問題
$ N $ 枚のカードが一列に並べられており、左から $ i $ 番目のカード(カード $ i $ とする)には整数 $ A_i $ が書かれています。
カードの中から何枚かを選んで、書かれた整数の合計が $ S $ となるときのカードの組み合わせを出力してください。
[制約]
🔹$ 1 \leqq N \leqq 60 $
🔹$ 1 \leqq S \leqq 10000 $
🔹$ 1 \leqq A_i \leqq 10000 $
解き方・ソースコード
前回記事では、カードの合計値が $ S $ となるかどうかを判定しました。
今回はカードの合計値 $ S $ になる組み合わせがある場合、そのカードの組み合わせを出力します。
まずは、前回記事と同様に動的計画法を使って合計が $ S $ になるかどうかをチェックします。
この時に作成した $ dp $ を合計値 $ S $ から $ 0 $ にさかのぼって確認すると、選ぶべきカードを復元することができます。
カードを選ぶかどうかは、以下の2条件を確認することで判断します。
🔹$ dp[x - 1][合計値] = True $ の場合:カード $ x $ を選ばない
🔹上記以外:カード $ x $ を選ぶ(カードを選んだら、カードの数字を合計値から差し引き、カード $ x $ を保管しておく)
[Google Colaboratory]
1 | #--------- 入力例 ---------- |
[実行結果
解: 2 3 2
[2, 3, 2]という数字の書かれたカードの組み合わせを選ぶと、合計が7になることが分かりました😊