本人大三鸟,本不想在博客添加这个这类型文章。但是手贱参加了2个比赛,平时工作也蛮忙的,也就发这类型贴进行督促作用,本人承若每天1到2道编程题,5月之前主要是图论题和动态规划题。
题目:一平面有n点,两两匹配求最小值。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
main()
{
int i,n,j;
float b[20][20]={0},d[10000]={0},a[20][2]={0};
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%f,%f",&a[i][0],&a[i][1]);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
b[i][j]=sqrt((a[i][0]-a[j][0])*(a[i][0]-a[j][0])+(a[i][1]-a[j][1])*(a[i][1]-a[j][1]));
for(i=1;i<(1<<n);i++)
d[i]=-1000000;
for(int s=0;s<(1<<n);s++)
{
int k=0;
for(i=0;i<n;i++)
if(s&(1<<i))
k++;
if(k%2==0)
{
for(i=0;i<n;i++)
if(s&(1<<i))
break;
for(j=i+1;j<n;j++)
if(s&(1<<j))
if(d[s]<b[i][j]+d[s^(1<<i)^(1<<j)])
d[s]=b[i][j]+d[s^(1<<i)^(1<<j)];
}
}
printf("%6.2f",d[(1<<n)-1]);
}
这题dp求值。在状态中必有一个点和某一点匹配,所以只需求这一点与谁最优值