题目的的意思就是给出n 然后给出2 * n个点.两两分成n组,距离和最小.
集合上的动态规划模板题:用状态压缩表示所有状态下,的最优解.
AC代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
const int INF = 0x3f3f3f3f;
const int N = 20;
const int M = 1 << 20;
char name[25];
struct point{
double x;
double y;
}p[N];
double f[M];
double dis[N][N];
int n;
double cul(point a , point b) {
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) );
}
int main () {
int cas = 1;
while(scanf("%d",&n) && n != 0) {
n = n * 2;
for (int i = 0 ; i < n ;i++) {
scanf("%s",name);
scanf("%lf%lf",&p[i].x , &p[i].y);
}
for(int i = 0 ; i < n ;i++) {
for(int j = 0 ; j <= i ;j++) {
dis[i][j] = dis[j][i] = cul(p[i]