HDU 2955 01背包
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2955
题意:抢银行,求不被抓的情况下抢的最多的钱是多少。
思路:找到每一种能抢的钱的被抓概率,不被抓且钱最多的就是了。
AC代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 typedef long long ll; 7 8 void sol(){ 9 double p; 10 int n; 11 cin>>p>>n; 12 double dp[10005]={0},P[105]; //注意这里的dp数组要开大 13 int v[105],sum=0; 14 dp[0]=1; //初始化 15 for(int i=1;i<=n;i++){ 16 cin>>v[i]>>P[i]; 17 sum+=v[i]; 18 } 19 20 for(int i=1;i<=n;i++) 21 for(int j=sum;j>=v[i];j--) 22 dp[j]=max(dp[j],dp[j-v[i]]*(1-P[i])); 23 24 for(int i=sum;i>=0;i--) //找最大可以抢且安全的 25 if(1-dp[i]-p<1e-6){ 26 cout<<i<<endl; 27 break; 28 } 29 } 30 int main(){ 31 int T; 32 cin>>T; 33 while(T--) sol(); 34 return 0; 35 }