求助!!为啥这段代码能过啊?memset没问题吗?
  • 板块P1433 吃奶酪
  • 楼主rui_7777
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/8/28 02:06
  • 上次更新2023/10/27 13:23:00
查看原帖
求助!!为啥这段代码能过啊?memset没问题吗?
722141
rui_7777楼主2022/8/28 02:06

#include<iostream>
#include<math.h>
#include<algorithm>
#include<cstring>
#include<iomanip>
using namespace std;
double x[20];
double y[20];
int n;
double dp[20][35000];//dp[i][s]表示走到i这个点,已经到达过的集合为s
double dis(int i,int j)
{
 return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
} 
int main()
{
 cin>>n;
 for(int i=1;i<=n;i++)
 {
  cin>>x[i];
  cin>>y[i];
 }
 x[0]=y[0]=0;
  memset(dp,127,sizeof(dp));//设置全部dp为很大的数
 for(int s=1;s<(1<<n);s++)
 {
  for(int i=1;i<=n;i++)//s中新加入的元素可能是i 
  {
   if((s&(1<<(i-1)))==0)//s中没有这个元素。
   {
    continue;
   } 
   if(s==(1<<(i-1)))//s就只有这个元素。也就是选择起点。
   {
    dp[i][s]=0;
   }
   for(int j=1;j<=n;j++)//是从j走到i的
   {
    if(i==j||(s&(1<<(j-1)))==0)//没有j这个元素或者从i到i
    {
     continue;
     } 
    dp[i][s]=min(dp[i][s],dp[j][s-(1<<(i-1))]+dis(i,j));
   } 
   
  }
 }
 double ans=1e9;
 for(int i=1;i<=n;i++)
 {
  double s=dp[i][(1<<n)-1]+dis(i,0);
  ans=min(ans,s);
 }
 cout<<fixed<<setprecision(2)<<ans<<endl;
 } 

2022/8/28 02:06
加载中...