ミックスバックパック(モノトーンの最適化キュー複数のバックパック)(テンプレート)

ブリーフ

タイトル通り、混合リュック最適な時間のビットを立てます

 コードエリア

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
const  int型マックス= 1E5 + 10 

int型nは、V。
INT ヴァル[最大]、体積[最大]、NUM [最大]。
int型QUE [最大]。
int型のDP [最大]。

ボイドの仕事()
{ 
    memsetの(DP、0はsizeof (DP))。
    以下のためにint型 i = 1 ; iは= N <; iは++ 
    { 
        場合(NUM [I] == 1// 01背包
        {
             ためINTV = J; J> = [I]巻; J、
                DP [J] = MAX(DP [J]、DP [J -巻[I] + ヴァル[I]);
             続行; 
        } 
        IF(VOL [I] * NUM [I]> = V)             // 完全なバックパック、より重要な、理由は非常に時間のかかるプロセスキューモノトーン
        {
             のためにint型 J =巻[I]; J <= V; J ++ 
                DP [J ] = MAX(DP [J]、DP [J -巻[I] + ヴァル[I]);
             続行; 
        } 
        ためINT RES = 0 ; RES <巻[I]は、RES ++)                             // 列挙子I 
        {
            int型のヘッド= 0、尾= - 1。;
             のためのINT K = 0 ; K <=(V - RES)/巻[I]; K ++)                 // 列挙K」、すなわち、算術進行の数、各残りの数で更新
                 // 残りの唯一の同じ数が相互作用するので、
            {
                 int型、ヴァルK * [I] -値DP = [K *の巻[I] + RES]を             // 現在の値

                IF(尾-頭Kは==)                                     // 全ての材料がQUE【ヘッド】転写から排出することができない場合でも、 
                    ヘッド++ ;
                 一方(ヘッド<=尾&& QUE [尾] <=値)                 // 最大値をとります
                    tail-- ;  ++ ; 
                QUE [尾] = 値。
                DP [k個 *容積[I] + RES] = QUE [ヘッド] + K * ヴァル[I]。
            } 
        } 
    } 
}
コードの表示

おすすめ

転載: www.cnblogs.com/winter-bamboo/p/11545483.html