题目链接:
题意:给出N个点,第一个点是裁判,其他N-1个点需要裁判过去回答问题,每个点需要的时间不一样,而每个裁判最多能回答M分钟的问题。题目分两问,第一问是如何分配可以使使用的裁判数最少,第二问是如何分配裁判,使裁判走过的总路程和最少,裁判一开始都在1,最终也要回到1。
思路:首先我们可以把符合条件的集合预处理出来,然后对于第一问,可以用状态压缩解决,dp[state]表示该状态下的最少裁判数,对于第二问,就是多旅行商问题了,dp[i][j]表示状态为i,在位置j的最小花费,然后开一个best数组来保存最有状态,最后枚举子集,DP合并环即可。比如1~3三个点,裁判在1,那答案就是Min(1->2->3->1,1->2->1 + 1->3->1)。
1 #include2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define inf 1<<30 8 9 struct Point{10 int x,y;11 }point[17];12 13 int n,m,ans,val[17],dp1[1<<17];14 int dp[1<<17][17],best[1<<17];15 int Ok[1<<17];16 int dist[17][17];17 18 int Get_Dist(int i,int j)19 {20 return ceil(sqrt(double(point[i].x-point[j].x)*(point[i].x-point[j].x)+double(point[i].y-point[j].y)*(point[i].y-point[j].y)));21 }22 23 int Judge(int state)24 {25 int sum=0;26 for(int i=0;i