状压dp,WA#3,#5,#12,#13,少了几个1(¿)
代码如下
#include <bits/stdc++.h>
using namespace std;
const int N=16;
int n;
double x[N],y[N];
double dist(int x1,int y1,int x2,int y2){
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
double f[N][1<<N]; //f[i][j(10110...)]:到第i个点时,路径为二进制下的j时的最短路径
int main(){
memset(f,127,sizeof(f));
cin>>n;
for(int i=1;i<=n;i++) cin>>x[i]>>y[i];
for(int i=1;i<=n;i++){
f[i][1<<(i-1)]=dist(0,0,x[i],y[i]);
}
for(int bit=1;bit<(1<<n);bit++){ //备注:不能到1<<n,那是n+1位的二进制数,到-1
for(int i=1;i<=n;i++){
if(bit&(1<<(i-1))==0) continue;
for(int j=1;j<=n;j++){
if(i==j||bit&(1<<(j-1))==0) continue;
f[i][bit]=min(f[i][bit],f[j][bit-(1<<(i-1))]+dist(x[i],y[i],x[j],y[j]));
}
}
}
double ans=1e9;
for(int i=1;i<=n;i++){
ans=min(ans,f[i][(1<<n)-1]);
}
printf("%.2f",ans);
return 0;
}
样例没问题,求调
orz