ああ...
トピックリンクします。https://www.luogu.org/problemnew/show/P1616
まず、この質問の正の解である:フルバックパック。
まず、バックパック?
バックパックカテゴリ:
バックパックは01バッグ、バックパックおよびこれらの3つの基本的なモデルの完全な複数のバックパックに分けられ、ナップサック問題の他の3種類のバックパックの拡張アプリケーションのうちからです。
このセクションでは説明しますから適応この質問 <P1048>采药
- ポータルを。
この質問は何のバックパックですか?
一見質問表面:[无限量]
薬を選ぶが、これは完全にバックパックです。
テンプレートタイトルリュック全面このです:商品のn個の種類があり、各項目は、重量との値を有します。しかし、各項目の数はバックパックながら、無限です、
最大荷重はMであり、これは、(同じ記事を無制限選択)いくつかの部分の物品のn種類から選択される重量及び以下Mように、最大値とされます。
私たちは共同所有者、アイテムの無制限の数のそれぞれの上記の説明を参照して、この問題の特徴。だから我々は唯一の01リュックコードを若干修正する必要があります。(01マルチターンのみわずかに修正されました)
第二に、コード?
バックパックの完全なコードスニペット:
1 ため(int型 I = 1 ; I ++; iが= N < ) 2 のための(INT J = W [i]は、J <= V; J ++ ) 3 DP [J] = MAX(DP [J]、F [J - W [I] + C [I])。
01バックパックスニペット:
1 ため(int型 i = 1 ; iは<N =; I ++ ) 2 のための(INT J = M; J> = sの[I]; j-- ) 3 DP [J] = MAX(DP [J]、DP [ J-S [I] + V [I])。
違いは?
逆の変更のため、我々は、更新後に、現在の薬の再発のステータスを変更する必要があるため。だから、順序を解決するために。
ACコード:
1の#include <cstdioを> 2の#include <iostreamの> 3 4 使用して 名前空間STDを、 5 6 のconst int型 MAXN = 100005 。 7 8 int型TI [MAXN]、DP [MAXN]、ヴァル[MAXN]。 9つの int型のANS; 10 11 INT メイン(){ 12 のint T、M。 13 のscanf(" %D%dの"、&T&M)。 14 のために(int型 I = 1 ; I <= M Iは++ ) 15 scanf関数(" %D%dの"、およびTI [i]は、&ヴァル[I])。 16 のために(int型 I = 1 ; I <= M Iは++ ){ 17 のために(INT ; J <= T J = TI [I] J ++ ){ 18 - TI [I DP [J] = MAX(DP [J ] + ヴァル[I]、DP [J])。 19 } 20 } 21 のための(int型 I = 1 ; I <= T; iは++ ) 22の ANS = MAX(ANS、DP [I])。 23 のprintf(" %d個の\ n " 、ANS)。 24 リターン 0 ; 25 }