ブリーフ
タイトル通り、混合リュック最適な時間のビットを立てます
コードエリア
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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]。 } } } }