我是靠谱客的博主 清秀裙子,这篇文章主要介绍HDU - 2955 - Robberies,现在分享给大家,希望可以做个参考。

题目链接

点此跳转

思路

变量含义:

  • 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[jw[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内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部