给出n个点(n<=15)求出从(0,0)经过所有点的最短路线长度
状态压缩ans[i][j] ,其中i用二进制表示经过了哪些点,j表示当前停留在什么点,dfs加剪枝即可
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=1<<16;
double dis[16][16];
double x[16],y[16];
double ans[maxn][16];
double Ans;
int n,tp;
void dfs(int a,int b);
int main()
{
x[0]=y[0]=0;
while(scanf("%d",&n)!=EOF)
{
tp=1<<n+1;
for(int i=0;i<tp;i++)
for(int j=0;j<=n;j++) ans[i][j]=1e9;
ans[1][0]=0;
for(int i=1;i<=n;i++)
scanf("%lf%lf",&x[i],&y[i]);
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
dis[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));