最初は砂の彫刻のアイデアだと思った、DP、DP第一線工程その後、最適なソリューションを処理する線形DPが続くチームと(戦闘とコスト)を入力する必要があります誰の束、ネストされているが、アルゴリズムことがわかりましたこの事は何もセックスの効果ではないではありません後ので、偽。他の場合は非常に大きいが正面よりも小さい分子と分母の比率と同じである比率の分子と分母が大きい大きい可能な場合ので、これは少しを与えるです。しかし、今、人々の比較的小さなバンドルを持って前に得られた小分子は、参加するよりも大きくなり、大きな割合に加えます。このアルゴリズムは死んでいます。
このフォームは本当にアップし、分子と分母ダウンに、答えは小数半分かもしれたいので、その後すぐに、(タイトル私はそれをプレイしていない)を予定し01得点を考え、精度は非常にカードが死んでいない、唯一の問題は、人々の問題にバンドルされています私はそれらを分離することはできませんが、重いとは別に考慮されませんので、あなたは、バックパックを確認するために木を使用することができます。
しかし、最大値が最大値である取ることが、いっぱい取らないように注意して、それがバックパックにロードされても否定的です。バックパックの初めにこのような初期値は、直接強制購入に相当、このノードの記事、上で与えました。データは、サブツリー2500を実行するためにマージされているので、夏謝うまく。
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <CStringの> 4の#include <ベクトル> 5 使って 名前空間STD。 6 CONST INT MAXN = 2505、INF = 1E9。 7 INTのN、K、MX、[MAXN]、B [MAXN]、SZ [MAXN]、R [MAXN]、D [MAXN]。 8個の ダブルC [MAXN]、DP [MAXN] [MAXN]、TMP [MAXN]。 9ベクトル< INT > CH [MAXN]。 10の ボイド DFS(INT X) 11 { 12 のために(INT I = 0; I ++は、私はCHで[X] .size()< [I]))DFS(CH [X]。 13の SZ [X] = 1 ; DP [X] [ 1 ] =のC [X]。 14 のためには、(int型 = Iを0 ; iは<CH [X] .size(); iは++ ) 15 { 16 int型のT =のCH [X] [I]; 17 のために(INT J = 0 - TMP [J] =; J <= K J ++); INF 18 のための(int型 J = 0 ; J <=分(SZ [X]、K); J ++ ) 19 のための(INT K = 0 ; K <=分(SZ [T]、のK i); ++ k個) 20 TMP [J + K] = MAX(DP [X] [J] + DP [T] [K]、TMP [J + K])。 21の SZ [X] + = SZ [T]。 22 のための(int型 J = 0 ; J <=分(SZ [X]、K); J ++)DP [X] [J] = MAX(TMP [J]、DP [X] [J])。 23 } 24 } 25 ブールチェック(ダブルMID) 26 { 27 のための(int型 i = 0 ; iがn = <; iは++ ) 28 { 29 C [I] = 1.0 * [I] -mid * B [i]は、 30 のための(int型 J =0 ; J <= K; J ++)DP [I] [J] = - INF。 31 } 32の DFS(0 )。 33 リターン DP [ 0 ] [K]> = 0 。 34 } 35 のint main()の 36 { 37 のscanf(" %D%dの"、&K、&N); K ++ 。 38 のためには、(int型 I = 1は iが++; iがn = < ) 39 { 40 (scanf関数を" %D%D%D "、&B [i]は、&[I]、およびR [I])。 41 MX + =[I]。 42個の CH [R [I]一back(I)。 43 } 44 ダブル L = 0、R = 1E7。 45 一方(RL> 1E- 4 ) 46 { 47 ダブルミッド=(L + R)/ 2 。 48 であれば(チェック(MID))L = ミッド。 49 他の R = ミッド; 50 } 51 のprintf(" %.3lfする\ n " 、L)。 52 リターン 0 。 53 }