您的位置:首页 > 其它

uva10911(集合DP)

2014-12-21 19:49 260 查看
题目的的意思就是给出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
;
double f[M];
double dis

;
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] , p[j]) ;
}
}
f[0] = 0;
for (int s = 1 ;s < (1 << n) ;s++) {
int i , j ;
f[s] = INF;
for(i = 0 ; i < n ;i++) {
if(s & (1 << i))
break;
}
for (j = i + 1 ; j < n ;j++) {
if(s & (1 << j)) {
f[s]  = f[s] < dis[i][j] + f[s ^ (1 << i) ^ (1 << j)] ?
f[s] : dis[i][j] + f[s ^ (1 << i) ^ (1 << j)];
}
}
}
printf("Case %d: %.2lf\n",cas++ ,f[(1 << n) - 1]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: