問題の意味
バックパック、所与の容量の$ W $は、それぞれ、$ $ $ 1 $ 8のオブジェクトの数のボリュームの最大容量は、バックパックを超えない容量を評価します
考え
$ 840に$ 840 = LCM(1-8)、Y <840 * 8 $、物品の全ての種類の選択したプログラムのためのアイデアは$ 840 * T_I +として表現することができる* X + Yの$形式を変換回答を検討フォームK_Iの$、我々はこのような状況の下で選択されたコピーの数に対応する最大$ 840 $は答えを得ることができるようになります知って取得することができる場合は、我々は唯一、一緒に$ 840それらの項目の十分な$をこすりするために選択した各項目の場合を考えます。したがって、$ DP [I] [J] $が正面を表しては$ I考慮完了している - コピー品の1 $種類の後、物品の重量によって$ J $を撤回$ 840 $の最大数を取得するには、明白な答えは$最大(840 * DP [ですもちろん9] [I] + I)$、これは、$ W $のバックパックの容量、$ W $なども比較を超える可能性があります。
コード
#include <ビット/ STDC ++ H> に#define DBG(X)CERR << #X << "=" << X << ENDL 名前空間stdを使用。 typedefの長い長いLL。 CNT、W LL [10]、DP [10] [840 * 8 + 5]。 INTメイン(){ scanf関数( "%のLLD"、&W) ( "%のLLD"、&CNT [i])とscanfのための式(I ++; iは= 8 <I = 1 INT)。 memsetの(DP、-1、はsizeof DP)。 DP [1] [0] = 0。 以下のために(INT I = 1; I ++; iは= 8 <){ ための(int型J = 0であり、j <= 840 * 8; J ++){ IF(DPを[I] [J] == -1)続けます。 LLさt =分(CNT [i]は、840LL / I)。 {(; <= T K kは++のint K = 0)のための DP [I + 1] [J + K * I] = MAX(DP [I + 1] [J + K * i]は、DP [I] [ J] +(CNT [I] - K)/(840 / I))。 } LL ANS = 0。 以下のために(INT i = 0; iが<= 840 * 8; iは++){ IF(I> W || DP [9] [I] == -1)続けます。 ANS = MAX(ANS、私はDP [9] [i]は、(W(分+ - I)/ 840)* 840)。 } COUT << ANS。 }