您的位置:首页 > 产品设计 > UI/UE

UVA 10911 Forming Quiz Teams

2015-08-13 22:55 405 查看
点击打开链接

思路:状态压缩,用一个整数的二进制来表示分组状态,然后枚举

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int n;
struct note
{
double x,y;
}a[20];
double dp[1<<21];
double len[20][20];
double sum;
double dis(note a,note b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

double slove (int s)
{
if(dp[s]!=-1)
return dp[s];
dp[s]=5656565;
for(int i=0;i<n;i++)
{
if(s&(1<<i))
{
for(int j=0;j<n;j++)
{
if((i!=j)&&(s&(1<<j)))
{
dp[s]=min(slove(s^(1<<i)^(1<<j))+len[i][j],dp[s]);
}
}
}
}
return dp[s];
}
int main()
{
freopen("in.txt","r",stdin);
int ans=1;
while(scanf("%d",&n)!=EOF&&n)
{
char hhh[30];
n=n*2;
for(int i=0;i<n;i++)
scanf("%s%lf%lf",hhh,&a[i].x,&a[i].y);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
len[i][j]=len[j][i]=dis(a[i],a[j]);
}
}
int s=(1<<n)-1;
for(int i=1;i<=s;i++)
dp[i]=-1;
dp[0]=0;
slove(s);
printf("case %d: %.2lf\n",ans++,dp[s]);

}
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: