質問の意味:
N- $ $バッグ空間$ Mは$、$ $ a_iを用物品の種類の$ I $のボリューム、$ b_i $の値として、商品の種類を無制限に存在しています。達成バックパックの容量を超えることなく、最大値を求めます。
$ N \ル10 ^ 6、\クワッドM \ル10 ^ {16}、\クワッドa_iを、b_i \ル100 $および正の整数です。
分析:
貪欲:実際には、$ 100 \ $ N $が$ 10 ^ 4 $にスケールダウンするように、重複排除とみなすことができるアイテムの倍100 = 10 ^ 4 $種類まで。
貪欲II:2つの項目のボリュームが同じであれば、我々は確かに$ 100 $ダウン低い値用品、などの$ n $スケールの種類をインストールしません。
変換:$ mの$は大きすぎるので、しかし、我々は、最高のコスト項目は非常に多くの時間を表示されますと考えることができ、$ a_iを$に比べて小さいので、私は、最終的な計画は多くの小さな同じプログラムに分割することができます確信しています(すべての機器)、その後、同じ記事の予算の容量の残りの部分。だから我々は最初のバックパック小容量(最大サポートされている範囲)、そして再び、最終的な計画の構成を行います。
要約すると、我々\ル最初の$ Nを行う100 $、$ M \ル2 \回10 ^ 5 $フルバックパック、バックパック提供$ F_iと容量は$ $ I(1 \ルI \ル2 \回10 ^表さ5)$を取得することができる最大値を、そこ$$ F_M = \ mathop {最大} \ limits_ {i = 1} ^ {2 \回10 ^ 5} \ {\ lfloorのM / I \ rfloor \回のf_i + F_ {m個の\%のI} \} $$
実装(100):
#include <iostreamの> する#include <cstdioを> する#include <CStringの> する#include <cmath> の#include <アルゴリズム> の#define ILインライン 使用 名前空間STDを、 typedefの長い 長いLL。 CONSTの INT N = 100 。 const int型 M = 2E5; int型のn; LLのM、W [ 103 ]。 LLのF [M + 3 ]。 INT メイン(){ freopenは(" backpack.in "、" R "、STDIN)。 freopenは(" backpack.out "、" W " 、STDOUT)。 scanf関数(" %Dの%のLLD "、&N、&M)。 memsetの(W、0、はsizeof W)。 以下のために(int型 i = 1 ; iが++; iが<= N {) LLのX、Y。 scanf関数(" %のLLDの%のLLD "、およびX&Y)。 [X]、W = MAX([X]、Y、W)。 } のmemset(F、0、はsizeofのF)。 以下のための(int型i = 1 ; iが= Nを<; I ++ ) のための(INT J = I; J <= M; J ++ ) F [J] = MAX(F [J]、F [JI] + W [I])。 LL ANS = 0 。 以下のために(int型 iは= 1 ; I <= M iは++ ) ANS = MAX(ANS、M / I [i]が+ F [Mの%Fを* I])。 printf(" %のLLD " 、ANS)。 リターン 0 ; }
要約:
さまざまなトピックを作成するさまざまなデータのスケール、。あなたは柔軟になることを学ぶ必要があります。