6月ニンニク長い時間が私は海外に行きたかった、そして今、彼は、彼らが学校のために適用する必要があるので、すべての材料を準備する準備を、必要なすべての試験を完了しました。海外の任意の大学のために適用するには、あなたが適用する料金を支払う必要があり、これは非常に印象的です。ニンニクの王は多くのお金を持っていなかった、我々は唯一のn百万の合計を救いました。彼は、m個の学校で(彼の手頃な価格の範囲内で当然の)の数を選択します。各学校では、彼は学校の申し出にBの可能性を得た推定異なる申請料(百万ドル)、そしてニンニク王を持っています。
オファーは別の学校間でお互いに影響を与えないかどうか。「私はオファーをNEED」、と彼は叫びました。貧しい人々を助け、助け、彼は彼が少なくとも一つのオファーの最大確率を受けることができることを計算します。(あなたが複数のニンニク6月の学校を選択した場合は、任意のオファーの学校ができ得ます)。
入力形式
最初の行は2つの正の整数N、M(0≤n≤10000,0≤m≤10000)を有しています。
m行の後ろに、各行は二つのデータAは、I(整数)、B I(実数)を示すi番目のアプリケーション料や学校は、確率を得るために提供することができます。
出力フォーマット
ジュンニンニクを表す出力するデータ対応の各セットは、少なくとも一つの最大確率を提供することができます。1つの小数点以下の場所に正確な割合として表現。
サンプル入力
10 3 4 0.1 4 0.2 5 0.3
サンプル出力
44.0%
01ナップザック問題
ここでは、01とバックパックの伝達方程式の前になり、状態遷移方程式のステータスを変更します。
DPは、[j]は、少なくともあなたは学校の確率プランを取得することができ、コストJの元を表します。
学校が提供を取得するためにXドルを費やしているという可能性がある場合はyです。この時間は1.0-(1- DP [JX])*(1-Y)であるので、試験に合格する第1の確率、少なくとも学校の確率に収容されているその補数を計算します。
状態遷移方程式:
DP [J] = MAX(DP [J]、1.0-(1- DP [JX])*(1-Y))
1の#include <stdio.hの> 2の#include < ストリング・H> 3の#include <iostreamの> 4の#include < ストリング > 5の#include <math.h>の 6の#include <アルゴリズム> 7の#include <ベクトル> 8#含む<スタック> 9の#include <キュー> 10の#include < セット > 11の#include <地図> 12の#include <sstream提供さ> 13の#include <ctimeの> 14 のconst int型 INF = 0x3f3f3f3f 。 15のtypedef 長いです ロングLL; 16 CONST INT MOD = 1E9 + 9 。 17 CONST LL MOD = 1E9 + 7 。 18 CONST ダブル PI = ACOS( - 1 )。 19の CONST ダブル EPS = 1E- 8 。 20 の#defineバグCOUT << "---------------------" << ENDL 21 CONST INT MAXN = 1E5 + 10 。 22 使って 名前空間はstdを、 23 24 のint A [ 10005 ]。 25 ダブル B [10005 ]。 26 二重 DP [ 10005 ]。 27 28 のint main()の 29 { 30 の#ifdefデバッグ 31 freopenは(" SAMPLE.TXT "、" R " 、STDIN)。 32 #endifの 33 // ios_base :: sync_with_stdio(偽); 34 // cin.tie(NULL)。 35 36 整数N、M。 37 のscanf(" %D%D "、&N、&M)。 38 のための(int型iは= 1 ; I <= M; I ++ ) 39 のscanf(" %D%LF "、および[I]、&B [I])。 40 のために(INTは iは= 1 ; I <; I ++ = M ) 41 { 42 のために(INT J = N; J> = [I]; j-- ) 43 DP [J] = MAX(DP [J]、1.0 - (1 -dp [JA [I]])*(1 - B [I]))。 44 } 45 のprintf(" %.1f %% \ n "、DP [N] * 100 )。 46 47 リターン 0 ; 48 }
-