uva 10417 Gift Exchanging(概率 + dfs)

该博客介绍了UVA 10417 Gift Exchanging问题,这是一个概率和深度优先搜索(DFS)结合的应用问题。在一场生日派对中,主人要从不同包装的礼物中随机选择,以找到其最好朋友赠送的礼物。题目提供每种包装出现的次数和每个人携带特定包装的概率。解题方法是通过DFS枚举所有可能的情况,计算每种包装来自最好朋友的概率,并找出概率最大的包装。最终输出概率最大且包装编号最小的答案。

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

题目连接:uva 10417 Gift Exchanging


题目大意:有个2B过生日,请了n个朋友,每个朋友都会带一个礼物,礼物都是有包装的,但是包装只有5种,然后现在给出c1 ~c5,表示说现在桌子上出现各种包装的礼物各有多少个,然后告诉你每个人会带来5种包装的概率(和为1),第一个人是2B最好的朋友,2B想随即抽取一个,请问他应该拿哪一种包装的最好,即拿到最好朋友送得礼物的概率最大,输出包装号和概率,有相同概率输出包装号较小的。


解题思路:dfs枚举所有可能情况,并计算出现当前状况的概率为p(A), 然后分别记录最好朋友送某种包装的概率r[i],注意最有的概率p = r[i] / c[i] / p(A).最大即为答案。


#include <stdio.h>
#include <string.h>
#include <math.h>

const int MAXN = 15;
const int N = 5;

int n, cnt[MAXN];
double r[MAXN], p[MAXN][MAXN];

void init() {
	scanf("%d", &n);
	memset(r, 0, sizeof(r));
	for (int i = 0; i < N; i++)
		scanf("%d", &cnt[i]);
	for (int i = 0; i < n; i++)
		for (int j = 0; j < N; j++)
			scanf("%lf", &p[i][j]);
}

double dfs(int d, double c) {
	if (n == d) {
		return c;
	}

	double ans = 0;
	for (int i = 0; i < N; i++) {
		if (cnt[i] && fabs(p[d][i]) > 1e-9) {
			cnt[i]--;

			double t = dfs(d + 1, c * p[d][i]);
			ans += t;

			if (d == 0) r[i] += t;

			cnt[i]++;
		}
	}
	return ans;
}

void solve(double s) {
	int id = 0;
	double ans = 0;
	for (int i = 0; i < N; i++) {
		double c = r[i] / cnt[i];
		if (c - ans > 1e-9) {
			id = i;
			ans = c;
		}
	}
	printf("%d %.3lf\n", id + 1, ans / s);
}

int main () {
	int cas;
	scanf("%d", &cas);
	while (cas--) {
		init();
		double s = dfs(0, 1);
		solve(s);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值