hdu-2955(01背包+逆向思维+审题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955

思路:注意p和m[i]是被抓的概率,不能直接用,要转换为逃跑的概率,然后将得到的钱视为背包体积再求解。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
double p,vol[120],dp[12000]; 
int n,t,cost[120];
int main(void)
{
    int i,j,sum;
    cin>>t;
    while(t--)
    {
        memset(dp,0,sizeof(dp));
        sum=0;
        dp[0]=1;
        cin>>p>>n;
        p=1.0-p;
        for(i=0;i<n;i++) cin>>cost[i]>>vol[i],sum+=cost[i],vol[i]=1.0-vol[i];
        for(i=0;i<n;i++)
        {
            for(j=sum;j>=cost[i];j--)
            dp[j]=max(dp[j],dp[j-cost[i]]*vol[i]);
        }
        for(i=sum;i>=0;i--)
        {
            if(dp[i]>=p) break;
        }
        cout<<i<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/2018zxy/p/9821614.html