Problem Description
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
Bank j contains Mj millions, and the probability of getting caught from robbing it is Pj .
Output
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
一個關於揹包的題目。。題目的意思就是搶劫銀行,一個是搶劫的
錢,一個是被抓的概率,。 然後問最後在有限的概率之內,
可以搶到多少的錢。 那麼,我們可以將被抓轉化成不被抓,
所以,在輸入的時候。轉化概率,。爲1-p[i]; 然後呢,求全都搶到的
總錢數。之後,就是01揹包的模型,在一個概率的數組裏面,
只要在有限的安全概率之上,就可以了、、
#include<iostream>
using namespace std;
int max(int x,int y)
{
return x>y?x:y;
}
int main()
{
int bbs,n;
double m,p[110];
double a[10010]; //安全係數
int s[110];
cin>>bbs;
int i,j;
while(bbs--)
{
cin>>m;
m=1-m;
cin>>n;
int sum=0;
for(i=0;i<n;i++)
{
cin>>s[i];
cin>>p[i];
p[i]=1-p[i];//沒被抓的概率
sum+=s[i];
}
for(i=0;i<=sum;i++)
{
a[i]=0;
}
a[0]=1;//沒搶的時候
for(i=0;i<n;i++)
{
for(j=sum;j>=s[i];j--)
{
a[j]=max(a[j],a[j-s[i]]*p[i]);
}
}
for(i=sum;i>=0;i--)
{
if(a[i]-m>0.000000001)
{
cout<<i<<endl;
break;
}
}
}
return 0;
}