hdu 2955

題意:有幾組測試用例,第一個小數,表示搶劫犯被抓的概率p,第二個數N表示下面有N個銀行,下面N行,每行第一個數表示銀行有多少錢,第二個數表示能抓住搶劫犯的概率。求在不被抓住的情況下能搶到最多的錢

解析:求反概率,即不被抓住的概率

#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=10009;
float dp[maxn];
float pp,p[maxn];
int cost[maxn];
int t,n;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%f%d",&pp,&n);
        memset(dp,0,sizeof(dp));
        pp=(1-pp);
        int sum=0;
        for(int i=0;i<n;i++)
        {scanf("%d%f",&cost[i],&p[i]);
        p[i]=(1-p[i]);
        sum+=cost[i];
        //printf("%d %f\n",cost[i],p[i]);
        }
        dp[0]=1.0;
        for(int i=0;i<n;i++)
        for(int j=sum;j>=cost[i];j--)
        {dp[j]=max(dp[j],dp[j-cost[i]]*p[i]);

        }
        int i;
        for(i=sum;i>=0;i--)
        if(dp[i]>=pp)
        break;
        printf("%d\n",i);
    }
    return 0;
}


發佈了65 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章