DPは、どのような圧縮の状態ですか?
A:使用は、演算ビット(加算、減算、ほぼ以上のコンピューティングビット!)状態、及び動的プログラミングを記録します。
何が問題に適用されますか?
A:データ小さく、あなたが解決するための単純なアルゴリズムを使用することはできません。
例:
タイトル説明
キャンディショップのオーナー、キャンディのMフレーバーの合計が販売します。説明の便宜のために、我々は、Mは、第1〜Mを味う
スティーブは、すべての味のお菓子を味わいたいです。残念ながら、上司は一人でお菓子を販売したが、販売用パッケージ全体のパックのK個ません。
ご購入前にボブは、すべてのパックでお菓子の味を知ることができるので、幸いなことに、の味は、キャンディーの包み紙のキャンディーのK個を指摘しています。
お菓子のNパケットを考えると、あなたは、少なくともいくつかのパックを購入する暁明を計算し、あなたはお菓子のすべての味を楽しむことができます。
スティーブは、すべての味のお菓子を味わいたいです。残念ながら、上司は一人でお菓子を販売したが、販売用パッケージ全体のパックのK個ません。
ご購入前にボブは、すべてのパックでお菓子の味を知ることができるので、幸いなことに、の味は、キャンディーの包み紙のキャンディーのK個を指摘しています。
お菓子のNパケットを考えると、あなたは、少なくともいくつかのパックを購入する暁明を計算し、あなたはお菓子のすべての味を楽しむことができます。
エントリー
最初の行は三つの整数N、MとKを含んでいます
次のN行およびKキャンディ味のパケットを表すT1、T2、...、TKの整数。
1 <= N <= 100,1 < = M <= 20,1 <= K <= 20,1 <= Tiの<= M.
次のN行およびKキャンディ味のパケットを表すT1、T2、...、TKの整数。
1 <= N <= 100,1 < = M <= 20,1 <= K <= 20,1 <= Tiの<= M.
輸出
答えを表す整数。ボブは、すべての味を味わうことができない場合は、出力-1。
データは、それが圧縮DPの状態に適しており、小型です。
次のようにアイデアは以下のとおりです。
バイナリ1とゼロでキャンディの特定の種類の有無を表現します。例えば、上記の例によれば、キャンディの5種類の合計。第二ライン112は00011であり、第三の線123は、00 111で、最後の行512は、10011であり、...
その後、我々は、これらの状態で、DPストレージアレイを使用します。
INT DP [ 1 << M]。
各ラインの読み取りのために、それはキャンディーのこれらのタイプを購入することができますパックを購入表す、対応する要素を割り当てますに-1に初期化されています。
次のようにACコードは次のとおりです。
1の#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 4 int型のmain(){ 5 INT N、M、K、S、SS。 6 CIN >> N >> M >> K。 7 INT DP [ 1 << 20 ]。 8件の INT商品[ 100 ]。 9 のmemset(DP、 - 1、はsizeof (DP))。 10 のために(INT J = 0 ; J <nであり、j ++ ){ 11の SS = 0 。 12 のための(INTは私= 0 ; I <K; I ++ ){ 13 CIN >> S。 14の SS | =(1 <<(S - 1 ))。 15 } 16 商品[J] = SS。 17 DP [SS] = 1 。 18 } 19 のために(INT iは= 0、n iは<; I ++ ){ 20 のために(INT J = 0 ; J <(1 << M)は、J ++ ){ 21の 場合(DP [J] == -1)続けます。 22 もし(DP [J |商品[I]] == - 1 ) 23 DP [J | 商品[I] = DP [J] + DP [商品[I]]。 24 他 25 DP [J | 商品[I] =分(DP [J] + DP [商品[I]、DP [J | 商品[I])。 26 } 27 } 28 COUT << DP [(1 << M) - 1 ]。 29 }