HDU 2955 01背包

来源:互联网 发布:网络春晚2013 编辑:程序博客网 时间:2024/05/16 12:28
/*    这道题是01背包问题,但要进行转换    把列出来的总钱数作为总的重量。把逃跑成功的概率作为价值    只有当逃跑成功的概率大于预算逃跑成功的概率,这时候能抢的钱总数就是最多的    这里的vauel[0]=1也要初始化为1*/#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<string>#include<algorithm>#include<cstdlib>#define INF 0xfffffffusing namespace std;int mj[102];double pj[102], vauel[10002];int main(){    int t, n;    double p;    cin >> t;    while(t-- && cin >> p >> n)    {        int sum = 0;        p = 1.0 - p;//预算中逃跑成功的概率        for(int i = 1; i <= n; i++)        {            cin >> mj[i] >> pj[i];            pj[i] = 1.0 - pj[i];//每个银行逃跑成功的概率            sum += mj[i];//将总钱数加起来        }        memset(vauel,0,sizeof(vauel));        vauel[0] = 1;//vauel初始化为1        for(int i = 1; i <= n; i++)            for(int j = sum; j >= mj[i]; j--)            vauel[j] = max(vauel[j],vauel[j-mj[i]]*pj[i]);        for(int i = sum; i >= 0; i--)            if(vauel[i] >= p)//逃跑成功的概率大于预算的概率            {                cout << i << endl;                break;            }    }return 0;}

0 0
原创粉丝点击