UVa 11181 Probability|Given (条件概率 & 深度优先搜索)

本文介绍了一道关于使用深度优先搜索(DFS)算法计算给定条件下个人购物概率的问题。题目中,已知每个人购物的概率及实际购物人数,需计算每个人实际购物的概率。文章通过DFS枚举所有情况并给出解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

题目大意

\(n\)个人准备去超市逛, 其中第\(i\)个人买东西的概率是\(P_i\)。逛完以后你得知有\(r\)个人买了东西。根据这一信息, 请计算出每个人实际买了东西的概率。输入\(n\)(\(1 ≤ n ≤ 20\))和
\(r\)(\(0 ≤ r ≤ n\)), 输出每个人实际买了东西的概率。

题解

用DFS枚举每一种可能的情况, sum[n]表示总概率, sum[i]表示第\(i\)个人买了东西的概率之和, 则答案为sum[i]/sum[n]

代码
#include <cstdio>
#include <cstring>
#include <algorithm>
int n, r;
double probabilities[30], sum[30];
bool vis[30];
int cases;
inline void DepthFirstSearch(const int&, const int&, const double&);
int main(int argc, char const *argv[]) {
  while (~scanf("%d %d", &n, &r) && (n || r)) {
    for (register int i(0); i < n; ++i) {
      scanf("%lf", &probabilities[i]);
    }
    std::fill(sum, sum + 30, 0.0);
    memset(vis, 0, sizeof(vis));
    DepthFirstSearch(0, 0, 1);
    printf("Case %d:\n", ++cases);
    for (register int i(0); i < n; ++i) {
      printf("%.6lf\n", sum[i] / sum[n]);
    }
  }
}
inline void DepthFirstSearch(const int &cur, const int &countt, const double &probability) {
  if(countt > r || cur - countt > n - r) return;
  if(cur == n) {
    sum[n] += probability;
    for (register int i(0); i < n; ++i) {
      if (vis[i]) {
        sum[i] += probability;
      }
    }
    return;
  }
  vis[cur] = true;
  DepthFirstSearch(cur + 1, countt + 1, probability * probabilities[cur]);
  vis[cur] = false;
  DepthFirstSearch(cur + 1, countt, probability * (1.0 - probabilities[cur]));
}

转载于:https://www.cnblogs.com/forth/p/9715474.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值