点集配对问题 空间里n个点,使它们配成n/2对点,使得每个点恰好在一个点对中。
要求所有点队中,两点距离之和尽量下 n <= 20
d(s) = min(d{S - {i} - {j}+ |Pi Pj| | j属于S, j > i, i = min{S}}
这里解释一下min(S)的意思,其实倒不一定指的是距离原点最小。就算是按照输入的顺序也没关系。
假设原来有三对点:s={1,2,3,4,5,6}。
如果在第一个状态中我们认为1必须取,那么剩下的状态就会有{3,4,5,6},{2,4,5,6},{2,3,5,6},{2,3,4,6},{2,3,4,5}
五种情况,疑问是如果第一次取的是{2,3}怎么办,由上面的状态可以知道存在{2,3}的状态有{2,3,5,6},{2,3,4,6},{2,3,4,5}这三个集合,也就是说他们会需要对{2,3}做一次取舍决断,但是他们的上一个状态是取{1,x}的,也就是说,在上一次的抉择中,他们不是没有考虑到除了{1,x}的情况,只是推迟决定。这样做的目的是防止重复。例如{1,2,3,4,5,6}->{3,4,5,6}->{5,6}与{1,2,3,4,5,6}->{1,2,5,6}->{1,2}他们取舍的子集都是相同的。
由于改变的只是最优解路径上的顺序,因此并不会影响最优解的总和值【路径长度】,因此是完全可行的。
解题采用的是状压dp,主要是避免多维度大开销的问题。如果用一维表示一个点的取舍状态的话,那么6个点就需要6^6,20个点需要20^20。所以采用n位二进制,0代表舍,1代表取。