書式#include <cstdioを> する#include <CStringの> の#include <アルゴリズム> 使用して 名前空間はstdを、 INTの N、M、ANS、CNT = 1 。 INT [F 1000005 ]。 INT W [ 1000005 ]、V [ 1000005 ]。// 记得将数组开大 INT (メイン) { int型、B、C。 scanf関数(" %d個の%のD "、&N、&M)。 用(int型 iは= 1 ; iが<= N ++ I) { scanf関数(" %D%D%D "、&A、&B、&C) のための(INT J = 1。 J <= C; J << = 1 ) { V [ ++ CNT] = J * A、W [CNT] = J * B、 C - = J; } IF(C)V [CNT ++] = A * C、W [CNT] * B = C; // バイナリ最適化、分割 } ため(INT I = 1 ; Iは<= CNT; ++ I) のために(INT J = M; J> = W [I]; - J) F [J] = MAX(F [J]、F [JW [I] + V [I]); // シンプル複数のバックパック のprintf("%D \ n " 、F [M]); 戻り 0 ; }
それは、ここで使用されるバイナリが最適化されています
まず第一に、我々はバイナリ最適化の原則を知っている必要があります
19には、例えば、我々は1,2,4,8,3に分かれている場合
私たちは、1から19まで5つのショーのすべての番号の前に番号を使用することができます
そして、数5は、それが来る方法です
実際には、(1,2,4,8)以下のパワー及び数2を加算し、(3)の数との差その
私たちは各項目のバイナリを最適化された場合は、スペースの複雑さを増し、時間の複雑さを軽減することができます
トピックます。https://www.luogu.org/problemnew/show/P1776
します。https://dankuroto.blog.luogu.org/solution-p1776からの抜粋