杭電1203 I NEED A OFFER!


I NEED A OFFER!
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 15266    Accepted Submission(s): 6031
Problem Description
Speaklessはとっくに外国へ行きたいと思っていたが、今では必要な試験をすべて終え、準備する材料をすべて用意していたので、学校を申請する必要がある.海外のどの大学を申請するにも、一定の申請費用を払わなければならないのは驚くべきことだ.Speaklessはあまりお金がなくて、全部でn万ドルしか貯金していません.彼はmの学校の中でいくつかのものを選びます(もちろん彼の経済的な許容範囲内です).各学校には異なる申請費用a(万ドル)があり、Speaklessは彼がこの学校offerを得る可能性bを推定した.異なる学校間でofferが得られるかどうかは互いに影響しない.「I NEED A OFFER」と彼は大声で叫んだ.このかわいそうな人を助けて、計算を手伝って、彼は少なくとも1部のofferの最大確率を受け取ることができます.(Speaklessが複数の学校を選択した場合、任意の学校のofferを得ることができます).
 
Input
いくつかのグループのデータが入力され、各グループのデータの最初の行には2つの正の整数n,m(0<=n<=100000,0<=m<=10000)がある.
後のm行は、各行に2つのデータai(整数型)があり、bi(実型)はそれぞれi番目の学校の申請費用とofferを受け取る可能性がある確率を示している.
入力の最後に0が2つあります.
 
Output
各データのセットは、Speaklessが少なくとも1つのofferを得る可能性がある最大確率を示す出力に対応する.パーセンテージで表し、小数点以下の1桁まで正確に表す.
 
Sample Input
 
   
10 3 4 0.1 4 0.2 5 0.3 0 0
 

Sample Output
 
   
44.0%
Hint
You should use printf("%%") to print a '%'.


01背包。这里有个小技巧,就是转化为求收不到一份offer的最小概率。

AC代码如下:


#include
#include
using namespace std;

double min(double a,double b)
{
    return a=a[i];j--)
            dp[j]=min(dp[j-a[i]]*c[i],dp[j]);
        printf("%.1lf%%
",(1.0-dp[n])*100); } return 0; }