HDU-2955(01揹包 概率)

題意:

現在一個人想去搶劫銀行,如果他被抓的概率低於P的話,那麼他就是安全的。

然後給出N,代表他想搶劫的銀行的個數,然後N行,有Mj,Pj,代表的是銀行有Mj這麼多錢,然後被抓的概率是Pj。

然後問你當被抓的概率低於P的時候,叫你輸出他能夠搶到的最多的錢。

思路:

01揹包。然而把概率當容量是不可以的,因爲概率是浮點數。

考慮把金錢當容量。

狀態表示:f[m]表示獲得金錢爲m時的成功逃脫概率

轉移方程:f[j]=max(f[j],f[j-v[i]]*w[i]) 注意成功逃脫的概率是累乘

代碼:

#include<bits/stdc++.h>
using namespace std;
//Life is Short!
const int N=105;
int v[105];
double f[10005],w[105];
int main(){
    int T;
    cin>>T;
    while(T--){
        memset(f,0,sizeof f);
        f[0]=1;
        int n,m=0;
        double P;
        cin>>P>>n;
        P=1-P;
        for(int i=1;i<=n;++i){
            cin>>v[i]>>w[i];
            w[i]=1-w[i];
            m+=v[i];
        }
        for(int i=1;i<=n;++i){
            for(int j=m;j>=v[i];--j){
                f[j]=max(f[j],f[j-v[i]]*w[i]);
            }
        }
        for(int i=m;i>=0;--i){
            if(f[i]>=P){
                cout<<i<<endl;
                break;
            }
        }
    }
    return 0;
}

參考:https://blog.csdn.net/a1097304791/article/details/83586769

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