LightOJ

以前做过类似的题了 其实就是背包概率 然后找一个钱最多的即可

题目链接

#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int N = 1e5+7;
const double eps = 1e-6;
double dp[10007];
double a[107];
int b[107];
int main(){
//    ios::sync_with_stdio(false);
//    cin.tie(0);
    int t;
    scanf("%d",&t);
    int w=0;
    while(t--){
        memset(dp,0,sizeof(dp));
        double p; 
        int n;
        scanf("%lf%d",&p,&n);
        p=(1-p);
        int sum=0;
        for(int i=1;i<=n;i++){
            int m; double pi;
            scanf("%d%lf",&m,&pi);
            pi=1-pi;
            a[i]=pi;
            b[i]=m;
            sum+=m;
        }
        dp[0]=1;
        for(int i=1;i<=n;i++)
            for(int j=sum;j>=b[i];j--){
                dp[j]=max(dp[j],dp[j-b[i]]*a[i]);
            }
        int ans;
        for(int i=0;i<=sum;i++){
            if(dp[i]-p>eps){
                ans=i;
            }
        }
        printf("Case %d: %d
",++w,ans);
    }
}
原文地址:https://www.cnblogs.com/wmj6/p/11197869.html