$ソル$
これは、「ボリューム寸法」$ 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、 - 400、400 ) 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、0、400 ) 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 }