标签:
Description
Input
Output
Sample Input
Sample Output
1 #include<iostream> 2 #include<cstring> 3 #include<string> 4 #include<algorithm> 5 using namespace std; 6 #define maxn 10000+10 //数组大小要注意,选择最大的情况,100家银行 7 int cost[maxn]; 8 double gl[maxn],d[maxn]; 9 int main() 10 { 11 int T; 12 cin>>T; 13 while(T--) 14 { 15 int n,sum=0; 16 double p; 17 cin>>p>>n; 18 p=1-p; //逃脱概率 19 for(int i=0;i<n;i++) 20 { 21 cin>>cost[i]>>gl[i]; 22 gl[i]=1-gl[i]; //抢劫每家银行的逃脱概率 23 sum+=cost[i]; //抢劫所有的银行的金额 24 } 25 for(int i=0;i<=sum;i++) 26 d[i]=0.0; 27 d[0]=1.0; //初始化小偷不偷东西,为最安全 28 for(int i=0;i<n;i++) //不等于n,等于n就错了 29 { 30 for(int j=sum;j>=cost[i];j--) 31 { 32 d[j]=max(d[j],d[j-cost[i]]*gl[i]); //小偷偷j钱逃脱的最大概率 33 } 34 } 35 for(int i=sum;i>=0;i--) 36 { 37 if(d[i]>=p) //可以等于p 找到临界值 38 { 39 cout<<i<<endl; 40 break; 41 } 42 } 43 } 44 45 46 return 0; 47 }
心得:
比之前的01背包N难点,之前就是加法运算,但是这个概率要相乘,看题目的案例还以为又是加来加去,这个的话后面还要找临界值,好好理解下吧!!!
标签:
原文地址:http://www.cnblogs.com/Lynn0814/p/4721471.html