バックパックバイナリ最適化

書式#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からの抜粋

おすすめ

転載: www.cnblogs.com/kingderman/p/11232242.html