hdu_2955

/*

   01背包问题:

   刚一看题目和数据就认为是以给的概率为背包 ,然后就写了一个f[j]=max(f[j],f[j-v[i]]+c[i]);

  之后就是两遍的wrong answer 那我就感觉应该是写错了,参考了下别人的背包容器,感觉自己蠢蠢的,

  之后想明白了 对于给定的从该银行逃跑的概率为给定该银行概率*(之前逃跑的概率//因为题意已给出两事件相互独立。

  那么我们就设f[j] 为在抢到j元的时候我逃脱的最小概率为f[j];

  那么对于第i个银行来说,我就有两种考虑,一个是抢他喵的,一个是不抢,

  1:若是对于第i个银行抢了就有f[i-1][j-c[i]]*p[i],即对应的我在前i-1个银行所抢j-c[i]的最小概率乘上当前概率。

  2:否则就为f[i-1][j]

  那么可以优化空间为一维有f[j]=max(f[j],f[j-c[i]]*p[i]);

 //for( j=v;j>=c[i];j--)

 //对应的循环可以优化为c[i],以内再往前就是越界了不必考虑,对于f[0]=1,其他则为0,未抢劫安全概率当然为1,否则初始化为0,这样就会令其必为可行才进入计算。

注意:给定的p为被抓概率,我没运算的为逃脱概率 记得换算为1-p;

*/



#include <iostream>

#include <cstring>
#include <cmath>
using namespace std;

struct node{
    int m;
    double p;
}point[105];

double dp[10005];
int main()
{
    int t;
    cin>>t;
    while(t--){
        double p;
        int n;
        cin>>p>>n;
        p=1-p;
        point[0].m=0;
        for(int i=1;i<=n;i++){
            cin>>point[i].m>>point[i].p;
            point[i].m+=point[i-1].m;
            point[i].p=1-point[i].p;
            //cout<<"point="<<point[i].m<<endl;
        }
        memset(dp,0,sizeof(dp));
        dp[0]=1;
        for(int i=1;i<=n;i++){
            for(int j=point[n].m;j>=(point[i].m-point[i-1].m);j--){
                //cout<<"point="<<point[i].m-point[i-1].m<<endl;
                dp[j]=max(dp[j],dp[j-(point[i].m-point[i-1].m)]*point[i].p);
            }
        }
        for(int i=point[n].m;i>=0;i--){
            if(dp[i]>p){
                cout<<i<<endl;
                break;
            }
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值