题目链接
点此跳转
思路
变量含义:
f[i]
为,抢到的钱数为i
时不被抓到的概率。v[i]
为第i
次抢劫时不被抓到的概率。
转移方程:
f [ j ] = m a x ( f [ j ] , f [ j − w [ i ] ] ∗ v [ i ] ) large f[j] = max(f[j], f[j - w[i]] * v[i]) f[j]=max(f[j], f[j−w[i]]∗v[i])
初始化:
f[0] = 1
,表示抢到的总钱数为 0 时不被抓到的概率,即什么都不做,不被抓到的概率。因为什么都没有做,所以一定不会被抓,那么初始化为 1。
代码
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53#include <bits/stdc++.h> using namespace std; const int N = 10010; int n; int w[N]; double v[N]; double f[N]; void solve() { double p; int sum = 0; cin >> p >> n; p = 1 - p; for (int i = 1; i <= n; i ++ ) { cin >> w[i] >> v[i]; v[i] = 1 - v[i]; sum += w[i]; } memset(f, 0, sizeof f); f[0] = 1; for (int i = 1; i <= n; i ++ ) for (int j = sum; j >= w[i]; j -- ) f[j] = max(f[j], f[j - w[i]] * v[i]); for (int i = sum; i >= 0; i -- ) { if (f[i] >= p) { cout << i << endl; return; } } } int main() { ios::sync_with_stdio(0); cin.tie(0); int tt; cin >> tt; while (tt -- ) { solve(); } return 0; }
最后
以上就是清秀裙子最近收集整理的关于HDU - 2955 - Robberies的全部内容,更多相关HDU内容请搜索靠谱客的其他文章。
发表评论 取消回复