UVA 10911 Forming Quiz Teams

大意:最优配对问题,集合上的动态规划。

思路:我做了好久,找一个BUG找了好久,似乎LYJ的白书有错误额,想睡觉了,还是要多理解才行啦。

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;

const int MAXN = 1<<21;
const int INF = 0x3f3f3f3f;

int n;

struct node
{
	int x, y;
}a[MAXN];

double d[MAXN];

double dist(node a, node b)
{
	double ans = sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
	return ans;
}

void read_case()
{
	n *= 2;
	for(int i = 0; i < n; i++) scanf("%*s %d %d", &a[i].x, &a[i].y);
}

void dp()
{
	d[0] = 0;
	for(int S = 1; S < (1<<n); S++)
	{
		int i, j;
		d[S] = INF;
		for(i = 0; i < n; i++) if(S & (1<<i)) break;
		for(j = i+1; j < n; j++) if(S & (1<<j))
		{
			d[S] = min(d[S], dist(a[i], a[j]) + d[S^(1<<i)^(1<<j)]);
		}
	}
	printf("%.2lf\n", d[(1<<n)-1]);
}

void solve()
{
	read_case();
	dp();
}

int main()
{
	int times = 0;
	while(scanf("%d", &n) && n)
	{
		printf("Case %d: ", ++times);
		solve();
	}
	return 0;
}


你可能感兴趣的:(UVA 10911 Forming Quiz Teams)