[羅区P4141]のものは、「バックパックDPを」消えます

暴力:暴力は01バックパックのセットを、以下のいくつかを列挙 

F [i]は[J] F、番号方式リュックjの容量で、私の項目に示す[I] [J] = F [I-1]を[J] + F [I-1] [JW [ I]はO(n ^ 3)

最適化:01スタートとバックパックの消失を考慮していません、

Gの定義[I] [j]はiは表現され消え、プログラムjの数の容量、G [i]は[J] = F [N] [J] - 法的ありません

= G [i]の[JW [I] - [I] [J]グラムに対してアップしています

1の#include <iostreamの>
 2の#include <CStringの>
 3の#include <cstdioを>
 4  使って 名前空間STDを、
5  のconst  int型 MAXN = 2005 ;
6  の#define Rレジスタ
 7  INT [MAXN、W、N、M。
8  int型F [MAXN] [MAXN]、G [MAXN] [MAXN]。
9  のint main()の
 10  {
 11      のscanf(" %d個の%のD "、&​​N、&M)。
12      のための(R用のint i = 1 ; iは= N <++ I)
 13         scanf関数(" %のD "、&W [I])。
14      F [ 0 ] [ 0 ] = 1 15      のための(R用のint i = 1 ; I <= N ++ I)
 16          のための(R INT J = 0 ; J <= M; ++ j)は{
 17              F [I] [J] = F [I- 1 ] [j]は%10 18              であれば(JW [I]> = 0)(F [I] [J] + = F [I- 1 ] [JW [I])%= 10 19          }
 20      のためにINT I = 1 ; I <= N; I ++ 21である         ためINT J = 0 ; J <=は、M、J ++ ){
 22は              %G [I] [J] = F [N-] [J] 10 ;
 23は             IF( JW [I]> = 0)(G [I] [J] - = G [i]が[JW [I])%= 10 ;
 24          } // i番目の項目が選択されていない場合、ナップザック容量J、 Iを選択した場合、Gによって[i]は[JW [私は ]( iで表される基から選択されていない、バックパックは、[I] JW)明らかに引くために転送される
25      のためにINT I = 1 ; I <= N; I ++は){
 26である         ためINT J = 1 ; J <= M J ++ 27             printf(" %dの"、(G [I] [J] + 10)%10 )。
28の          プット("" );
29      }
 30 }
コードの表示

おすすめ

転載: www.cnblogs.com/casun547/p/11289860.html