HDU 1203 I NEED A OFFER!

明显的0 1背包。 被概率 取最小值卡了下。  至少一个学校 换一下就是 1- 一个学校都拿不到


这个题就好做了


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <fstream>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <list>
#include <vector>
#include <cmath>
#include <iomanip>
#include <cmath>
typedef long long LL;
typedef unsigned long long LLU;
const double PI=acos(-1.0);
using namespace std;
#define MAXN 10000+10
#define INF 1 << 30
struct Offer{
    int m;
    double x;
};
int main (){
    int M,n;
    while(scanf("%d%d",&M,&n)){
        if(M == 0 && n == 0)
        break;
        Offer s[MAXN];
        for(int i = 1; i <= n; i++){
            scanf("%d%lf",&s[i].m,&s[i].x);
            s[i].x = 1-s[i].x;
        }
        double f[MAXN];
        for(int i = 0; i <= MAXN; i++)
            f[i] = 2;
        f[0] = 1;
        for(int i = 1; i <= n; i++){
            for(int j = M; j >= 0; j--){
                if(j-s[i].m >= 0)
                    f[j] = min(f[j],f[j-s[i].m]*s[i].x);
            }
        }
        double MI = 1;
        for(int i = 0; i <= M; i++)
            MI = min(MI, f[i]);
        printf("%.1lf%%\n",(1-MI)*100);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值