HDU——2955Robberies
如果是整数的话,可以直接01背包,但是是概率,所以有小数,但是依然可以转换为01背包。记录总的价值,dp[i]作为取到i的最大不被抓概率。那么满足条件的最大i就是答案。一直在想怎么搞满足概率,其实完全不用考虑,直接所有的情况都找出来,最后再比较就行了。
1 #include <iostream> 2 #include <cstring> 3 #include <string> 4 #include <map> 5 #include <set> 6 #include <algorithm> 7 #include <fstream> 8 #include <cstdio> 9 #include <cmath> 10 #include <stack> 11 #include <queue> 12 using namespace std; 13 const double Pi=3.14159265358979323846; 14 typedef long long ll; 15 const int MAXN=100000+5; 16 const int dx[5]={0,0,0,1,-1}; 17 const int dy[5]={1,-1,0,0,0}; 18 const int INF = 0x3f3f3f3f; 19 const int NINF = 0xc0c0c0c0; 20 const ll mod=1e9+7; 21 int m[MAXN]; 22 double P[MAXN]; 23 double dp[MAXN]; 24 int main() 25 { 26 int t;cin>>t; 27 while(t--) 28 { 29 double p;int n; 30 cin>>p>>n;int sum=0; 31 for(int i=1;i<=n;i++) 32 { 33 cin>>m[i]>>P[i]; 34 sum+=m[i]; 35 36 } 37 memset(dp,0,sizeof(dp)); 38 dp[0]=1; 39 for(int i=1;i<=n;i++) 40 for(int j=sum;j>=m[i];j--) 41 dp[j]=max(dp[j-m[i]]*(1-P[i]),dp[j]); 42 int ans; 43 for(int i=sum;i>=0;i--) 44 { 45 if(dp[i]>=(1-p)) 46 { 47 ans=i;break; 48 } 49 } 50 cout <<ans<<endl; 51 } 52 return 0; 53 }