hdu 2955 Robberies (01背包好題)
阿新 • • 發佈:2018-10-11
\n int asp rabl wan limit line esc std
For a few months now, Roy has been assessing the security of various banks and the amount of cash they hold. He wants to make a calculated risk, and grab as much money as possible.
His mother, Ola, has decided upon a tolerable probability of getting caught. She feels that he is safe enough if the banks he robs together give a probability less than this.
Input
The first line of input gives T, the number of cases. For each scenario, the first line of input gives a floating point number P, the probability Roy needs to be below, and an integer N, the number of banks he has plans for. Then follow N lines, where line j gives an integer Mj and a floating point number Pj .
Bank j contains Mj millions, and the probability of getting caught from robbing it is Pj .
Output
For each test case, output a line with the maximum number of millions he can expect to get while the probability of getting caught is less than the limit set.
Notes and Constraints
0 < T <= 100
0.0 <= P <= 1.0
0 < N <= 100
0 < Mj <= 100
0.0 <= Pj <= 1.0
A bank goes bankrupt if it is robbed, and you may assume that all probabilities are independent as the police have very low funds.
Robberies
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 31769 Accepted Submission(s): 11527
For a few months now, Roy has been assessing the security of various banks and the amount of cash they hold. He wants to make a calculated risk, and grab as much money as possible.
His mother, Ola, has decided upon a tolerable probability of getting caught. She feels that he is safe enough if the banks he robs together give a probability less than this.
Bank j contains Mj millions, and the probability of getting caught from robbing it is Pj .
Notes and Constraints
0 < T <= 100
0.0 <= P <= 1.0
0 < N <= 100
0 < Mj <= 100
0.0 <= Pj <= 1.0
A bank goes bankrupt if it is robbed, and you may assume that all probabilities are independent as the police have very low funds.
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
題目大意:
Roy是一個盜賊。現在有n個銀行成了他的下手目標。對第i個銀行下手,他會獲得mi元錢,同時有pi的概率被抓。問在被抓概率不超過p的情況下,他最多能得到多少錢。
01背包好題。
這題仔細想想還是很有趣的。獲得的錢其實是背包容量。獲得這些錢安全的概率才是dp存儲的東西。要好好想想。
此外,對double類型變量輸入輸出是 printf&%f scanf&%lf,註意。
#include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<stack> using namespace std; const int maxn=100; int money[maxn+5]; double safe[maxn+5];//不被抓的概率作為重量 double dp[maxn*maxn+5];//獲得i錢,不被抓的概率 int main() { int t; scanf("%d",&t); while(t--) { double p;int n; scanf("%lf%d",&p,&n); p=1-p; int sum=0;//最多獲得多少錢 for(int i=1;i<=n;i++) { scanf("%d%lf",money+i,safe+i); safe[i]=1-safe[i]; sum+=money[i]; } for(int i=0;i<=sum;i++) dp[i]=0; dp[0]=1; for(int i=1;i<=n;i++) { for(int j=sum;j>=money[i];j--) { dp[j]=max(dp[j],dp[j-money[i]]*safe[i]); } } for(int i=sum;i>=0;i--) if(dp[i]>p) { printf("%d\n",i); break; } } return 0; }View Code
hdu 2955 Robberies (01背包好題)