标签:总数 string 情况下 容量 浮点数 独立 com end 一个
Input第一行给出了一个整数T, 表示有T组测试数据. 对于每一组数据,第一行给出了一个浮点数P, 表示POIUYTREWQ允许被抓的最大概率, 和一个整数N,表示他计划去抢劫的N个银行. 接下来N行, 每行给出一个整数数Mj和浮点数Pj.
抢劫银行 j 可获得 Mj 百万美金, 被抓的概率是 Pj .Output对于每组数据,每行输出一个整数,表示POIUYTREWQ在被抓概率小于P的情况下,可抢到的最多的金钱。
Notes and Constraints
0 < T <= 100
0.0 <= P <= 1.0
0 < N <= 100
0 < Mj <= 100
0.0 <= Pj <= 1.0
你可以认为每家银行都是独立的。Sample Input
3 0.04 3 1 0.02 2 0.03 3 0.05 0.06 3 2 0.03 2 0.03 3 0.05 0.10 3 1 0.03 2 0.02 3 0.05
Sample Output
2 4 6
这个题目的样例真的坑啊,,,刚开始做的时候我把逃跑概率当做背包的总容量,把price当做价值,心里还想着浮点数没关系,,乘以1e3就可以了,,然后当成了很简单的01背包的问题来做,这样样例竟然可已过。。。。
这个题目的正确做法就是把银行里的总金钱当做背包的容量,然后把逃跑的概率当做价值,就是说在背包容量为银行里钱的总数量是时,,能够逃跑的概率用dp数组存一下,然后在对整个背包的总容量进行遍历,找出那个最大逃跑概率下
的。。对应的容量就是最终答案
//题目给了每个银行的钱和被抓的概率,由于要抢尽量多的钱,所以要保证尽量不被抓, //而抢多个银行之后不被抓的概率是抢每一个银行不被抓的概率之积,我竟然把这一点给忘了! //导致我走了许多弯路,思路不能太死啊!dp[]表示抢到下标所对应的钱时,此时不被抓的概率, //题目给出了最终不能高于被抓概率P,不被抓的概率就不能低于(1-P), //所以最后只需要逆序遍历dp,找到第一个大于等于1-P的dp[i],就能够保证i最大,即抢到的钱最多。 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=1e6; double commit[N]; int price[N]; double dp[N]; int main(){ int t; cin>>t; while(t--){ double s; int sum=0; int n; cin>>s>>n; for(int i=1;i<=n;i++){ cin>>price[i]>>commit[i]; sum+=price[i]; } memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=1;i<=n;i++){ for(int j=sum;j>=price[i];j--){//将价格看成背包的容量 dp[j]=max(dp[j] , dp[j-price[i]] * (1-commit[i])); } } for(int i=sum;i>=0;i--){ if(dp[i]>=(1-s)){ cout<<i<<endl; break; } } } return 0; }
标签:总数 string 情况下 容量 浮点数 独立 com end 一个
原文地址:https://www.cnblogs.com/Accepting/p/11279108.html