没有uva账号,有人能帮忙跑一下吗,还有状压不会被卡时间吗
查看原帖
没有uva账号,有人能帮忙跑一下吗,还有状压不会被卡时间吗
1232566
Wh1t3zZlo楼主2024/10/30 00:40
#include<iostream>
#include<cmath>
using namespace std;

const int N = 25;

int c[N][N], n, r;
double p[N], ans[N], tot,vis[N];

void dfs(int i,int sum)
{
	if (sum > r) return;
	if (n - i + sum < r) return;
	if (i == n && sum == r)
	{
		double res = 1;
		for (int i = 0; i < n; i++)
		{
			if (vis[i] == 0) res *= 1 - p[i + 1];
			else res *= p[i + 1];
		}
		for (int i = 0; i < n; i++)
		{
			if (vis[i] == 1) ans[i + 1] += res;
		}
		tot += res;
		return;
	}
	vis[i] = 0;
	dfs(i + 1,sum);
	vis[i] = 1;
	dfs(i + 1,sum + 1);
}

int main()
{
	int cnt = 1;
	while (true)
	{
		cin >> n >> r;
		if (n == 0 && r == 0) break;
		for (int i = 1; i <= n; i++)
		{
			cin >> p[i];
			ans[i] = 0; vis[i] = 0;
		}
		tot = 0;
		
		dfs(0, 0);

		cout << "Case " << cnt << ":" << endl;
		for (int i = 1; i <= n; i++)
		{
			double l = ans[i] / tot;
			printf("%.6lf\n", l);
		}
		cnt++;
	}
	return 0;
}

一开始考虑的也是状态压缩,但是50组数据,每次遍历20位,再乘个2的20次方,都1e9了,时间都超了

2024/10/30 00:40
加载中...