以前做过类似的题了 其实就是背包概率 然后找一个钱最多的即可
#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\n",++w,ans); } }