2013 Asia Regional Changchun C-Little Tiger vs. Deep Monke 概率DP

HDU-4815

在这里插入图片描述

solution

d p [ i ] [ j ] = d p [ i ] [ j ] + d p [ i − 1 ] [ j ] ∗ 1 2 dp[i][j] = dp[i][j] + dp[i-1][j]*\frac{1}{2} dp[i][j]=dp[i][j]+dp[i1][j]21

d p [ i ] [ j ] = d p [ i ] [ j ] + d p [ i − 1 ] [ j − v [ i ] ] ∗ 1 2 dp[i][j]=dp[i][j]+dp[i-1][j-v[i]]*\frac12 dp[i][j]=dp[i][j]+dp[i1][jv[i]]21

e p s = 1 e − 8 eps=1e^{-8} eps=1e8 竟然WA了,改 e p s = 1 e − 6 eps=1e^{-6} eps=1e6 A 了.

code

/*SiberianSquirrel*/
/*CuteKiloFish*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const double PI = acos(-1), eps = 1e-6;
/*const int MOD = 998244353, r = 119, k = 23, g = 3;
const int MOD = 1004535809, r = 479, k = 21, g = 3;*/
const int INF = 0x3f3f3f3f, MOD = 1e9 + 7;
const int M = 3e2 + 10, N = 5e6 + 10;
int sgn(double x) {
    if(fabs(x) < eps) return 0;
    return x < 0? -1: 1;
}
//inline int rnd(){static int seed=2333;return seed=(((seed*666666ll+20050818)%998244353)^1000000007)%1004535809;}
//double Rand() {return (double)rand() / RAND_MAX;}

int n, v[50], res;
double P, dp[50][50000];

void init() {res = 0, memset(dp, 0, sizeof dp), dp[0][0] = 1.0;}

void solve(double _p = 0) {
    for(int i = 1; i <= n; ++ i) {
        for(int j = 0; j <= res; ++ j) {
            if(j >= v[i]) dp[i][j] += dp[i - 1][j - v[i]] / 2.0;
            dp[i][j] += dp[i - 1][j] / 2.0;
        }
    }
    for(int i = 0; i <= res; ++ i) {
        _p += dp[n][i];
        if(sgn(_p - P) >= 0) {
            cout << i << endl;
            return;
        }

    }
}

/*
8
23 0.0322581
270 284 924 622 650 861 571 326 655 543 703 212 735 361 456 559 576 82 80 394 187 26 358
25 0.0588235
334 320 268 799 600 849 823 103 785 36 12 428 745 871 526 870 913 550 749 396 22 156 972 907 235
29 0.5
795 183 161 45 810 638 52 708 888 961 895 269 137 227 885 691 17 369 46 436 758 864 275 614 399 479 209 311 715
20 0.0833333
12 33 719 814 256 168 252 968 450 704 262 759 539 251 771 595 700 87 319 129
15 0.125
261 275 208 145 126 230 927 539 171 918 50 634 236 717 157
39 0.03125
833 801 112 310 421 97 53 603 7 511 634 209 280 395 518 594 78 354 760 582 559 600 849 522 425 206 656 359 189 579 687 547 336 702 499 137 386 234 271
6 0.0454545
15 578 877 185 712 188
9 0.047619
701 298 693 864 730 838 886 559 485

2939
4210
6918
2752
1720
5605
185
1289
 */

int main() {
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(nullptr);
// srand(time(0));
#ifdef ACM_LOCAL
    freopen("input", "r", stdin);
    freopen("output", "w", stdout);
#endif
    int o = 1;
	cin >> o;
    while(o --) {
        init();
        cin >> n >> P;
        for(int i = 1; i <= n; ++ i) {
            cin >> v[i];
            res += v[i];
        }
        solve();
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值