题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955
英文题就得有翻译。。。
#include<iostream> #include<string> #include<cstdio> #include<cstring> #include<map> #include<queue> #include<cmath> #include<stack> #include<set> #include<vector> #include<algorithm> #define LL long long #define inf 1<<29 #define s(a) scanf("%d",&a) #define CL(a,b) memset(a,b,sizeof(a)) using namespace std; const int N=10005; int n,m,a,b,c; double p; double v[N]; // 保存单个逃跑的几率; double dp[N]; // 保存盗取N的金币逃跑的几率; int cost[N]; // 保存可获得的量; int main() { int t; s(t); while(t--){ int sum=0; scanf("%lf%d",&p,&n); for(int i=0;i<n;i++){ scanf("%d%lf",&cost[i],&v[i]); sum+=cost[i]; // 保存最多可以盗取的金币数量; } CL(dp,0);dp[0]=1.0; // 盗取金币为零的时候逃跑的概率为1; for(int i=0;i<n;i++) // 遍历每一个银行; for(int j=sum;j>=cost[i];j--) // 判断取还是不取; dp[j]=max(dp[j],dp[j-cost[i]]*(1-v[i])); for(int i=sum;i>=0;i--) if(dp[i]-1+p>1e-8){ printf("%d\n",i); break; } } return 0; }