Dpは$ /バックパック\ $ POJ1015 \陪審\妥協

 羅区ポータル

 

$ソル$

これは、「ボリューム寸法」$ 0 / $ 1ナップザック問題を複数有するものです。

候補者の数項目としてみなさ$ N $ N $ $は、各項目は、以下の3つのボリュームがあります。

各候補の1「数」は「数は」$ 1 $で、そして最終的に$ M $のボリューム埋めるためにバックパックを

2. "防衛スコア"、$ A [I] $

3. "反党スコア"、$ B [I] $

防衛は、$ D $の外に必要とされるとアウト$ P $検察の$ | $の差の絶対値| DP の選択方法が一意でない場合、次に選択し、最小$ D + P $の最大のプログラムを

したがって、$ [I] -b [I ] $ 一つのボリュームとして、$ [I] + B [ i]は$ 物品の値として

ここで注意してください[i]は-bを$ [I ] $が負であってもよいし、均一に加えているので$ 4000 $

$ I $を考慮して、個人の段階は、$ F [J] [K ] $ $ I $意味が以前にされているカスタム$ J $のために選択した個人、この時間差は$ K $の両方の外にある時、最大スコアの両方。

$のF [J] [K] = MAX(F [J] [K]、F [J-1] [K-([I] -b [I])] + [I] + B [i]は)$

必要な出力方式は、$ D [i]は[J]プラスアレイので [K] $は、 [I] [J] F $を表す [K] $ の$ I $ 記録するように候補を、グループから選択される基から選択されていませんプログラム。

 

$コード$

1の#include <iostreamの>
 2の#include <cstdioを>
 3の#include <CStringの>
 4  の#define Rgをレジスタ
 5  の#define ILインライン
 6  の#define MEM(A、B)のmemset(A、B、はsizeof(a)参照)。
7  の#defineは <;(= Bを、私は++ iがRgをint型私は=)のために(I、a、b)は行か
 8  の#defineはい(I、a、b)は(RG iは= int型のため、I = B;> i--)
 9  使用して 名前空間はstdを、
10のIL int型リード()
 11  {
 12      INT X = 0、Y = 1チャー C = GETCHAR()。
13      一方、(C < ' 0 ' || C> ' 9 '){ もし、(C == ' - ')Y = - 1 ; C = GETCHAR();}
 14      ながら(C> = ' 0 ' && C <= ' 9 '){X =(x << 3)+(X << 1)+ C- ' 0 ' ; C = GETCHAR();}
 15      リターンのx *のY。
16  }
 17  INT T、N、M、HHH = 400、T、CT、201 ]、F [ 21 ] [ 801 ] として [ 21 ]。
18  ブール D [ 201 ] [ 21 ] [ 801 ]。
19  のint main()の
 20  {
 21      ながら1 22      {
 23          N =(読み取り)、M =(読み取り)もし(!n)をブレーク24          のprintf(" ジュリー#%d個の\ n "、++ T)。
25          ゴー(I、1、N)[i]を読み出す=()、[I] = B )(読み取ります。
26         MEM(F、 - 777)、MEM(D、0 );
27          F [ 0 ] [HHH] = 0 ;
28          ゴー(I、1 、N)
 29              はい(J、M、1 30              ゴー(K、 - 400400 31                  {
 32                      であれば(K-([I] -b [I])> = - 400 && K-([I] -b [I])<= 400 && [J-F 1 ] [K-([I] -b [I])+ HHH] + [I] + B [I ]> = 0 && F [j] [kは+ HHH] <F [J- 1 ] [K-([I] -b [I])+ HHH] + [I] + B [i])と
 33                         F [j]は[K + HHH] = F [J- 1 ] [K-([I] -b [I])+ HHH] + [I] + B [i]は、D [i]は[J ] [K + HHH] = 1 34                      // IF(F [j]と[K + HHH]> = 0)COUT << "I:" << I <<」J: "<< J <<" K: "<< K <<" F "<< F [j]と[K + HHH] <<" D:」<< D [i]は[J] [K + HHH] << ENDL。
35                  }
 36          ゴー(I、0400 37          {
 38              であれば(F [M] [HHH + I]> = 0){ 場合(F [M] [HHH + I]> F [M] [HHH-I ])T = I。他の T = -i; ブレーク;}
 39              そう であれば(F [M] [HHH-1]> = 0){T = -i。破る;}
 40         }
 41          のprintf(" ベスト陪審は、防衛のための検察と値%dの値%dを有する:の\ n "、([M] F [HHH + T] + T)/ 2、([HHH + T] [M] F -t)/ 2 )。
42          int型 NW = N; CT = M。
43          一方(NW> 0 44          {
 45              INT DD = D [NW] [CT] [T + HHH]。
46              であれば(DD)として、T - - =([NW] - [CT] = NW、CT B [NW])。
47              nw-- ;
48          }
 49          ゴー(I、1、M)のprintf("%のD " などの [I]);のprintf(" \ nをする\ n " );
 50      }
 51      リターン 0 ;
 52 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/forward777/p/10993789.html