当前的概率基于前一种状态的概率,即偷n家银行而不被抓的概率等于偷n-1家银行不被转的概率乘以偷第n家银行不被抓的概率。
用dp[i]表示偷价值为 i 时不被抓的概率,则状态转移方程为:
dp[j] = max(dp[j] , dp[j-m[i]] * (1-p[i]));
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9334 Accepted Submission(s): 3489

|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 |
#include <iostream> #include <algorithm>using
namespace std;int main(){ int
i,t,n,sum,j; double
p; int
m[200]; double
pi[200],dp[10001]; cin>>t; while(t--) { sum=0; cin>>p>>n; p=1-p; for(i=0;i<n;i++) { cin>>m[i]>>pi[i]; sum+=m[i]; pi[i]=1-pi[i]; } memset(dp,0,sizeof(dp)); dp[0]=1; for(i = 0;i < n;i++) for(j = sum;j >= m[i];j--) if(dp[j]<dp[j-m[i]]*pi[i]) dp[j] = dp[j-m[i]]*pi[i]; for(i = sum;i >= 0;i--) if(dp[i]>p) { cout << i << endl; break; } } return
0;} |
原文:http://www.cnblogs.com/cancangood/p/3554549.html