練習三 1023

概述: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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章