概述:Speakless很早就想出國,現在他已經考完了所有需要的考試,準備了所有要準備的材料,於是,便需要去申請學校了。要申請國外的任何大學,你都要交納一定的申請費用,這可是很驚人的。Speakless沒有多少錢,總共只攢了n萬美元。他將在m個學校中選擇若干的(當然要在他的經濟承受範圍內)。每個學校都有不同的申請費用a(萬美元),並且Speakless估計了他得到這個學校offer的可能性b。不同學校之間是否得到offer不會互相影響。“I NEED A OFFER”,他大叫一聲。幫幫這個可憐的人吧,幫助他計算一下,他可以收到至少一份offer的最大概率。
思路:這個題要學會利用反向思維,找出“至少一個”的反命題“一個也沒有”,從而轉化爲DP問題。
感想:無。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <fstream>
using namespace std;
const int MAX=10005;
int main()
{
//ifstream cin("aaa.txt");
int a[MAX];
double dp[MAX],b[MAX];
int n,m;
while(cin>>n>>m && n && m)
{
for(int i=0;i<m;++i)
{
cin>>a[i]>>b[i];
b[i]=1-b[i];
}
for(int i=0;i<=n;++i) dp[i]=1.0;
for(int i=0;i<m;++i)
{
for(int j=n;j>=a[i];--j)
{
if(dp[j]>dp[j-a[i]]*b[i])
dp[j]=dp[j-a[i]]*b[i];
}
}
printf("%.1lf%%\n",(1-dp[n])*100);
}
return 0;
}