假设有x箱装满小饰品(随机数量)的x箱,以明眼可见(您可以看到每个箱中有多少个小饰品)。现在有两个玩家可以在轮到自己的时候从两端选择一个垃圾箱。他们不能放弃转弯。提出一种策略,让玩家获得最大数量的饰品。

x是偶数。

这是一个np完全问题吗?它与 bool SAT相似吗?

最佳答案

这是一个非常简单的问题,并且不是NP完整的。
这是算法的简短描述,它基于动态规划。

Can [i]-存储小饰品数量的数组。
F [i,j]-确定只有从i到j的 jar 头可用时,确定最佳移动方式的数组。 0表示从左侧获取,1表示从右侧获取。
G [i,j]-存储移动“好”的数组。

for (i=1 to n) F[i,i] = 0
for (i=1 to n) G[i,i] = Can[i]

for (i=1 to n-1)
   for (j=1 to n-i)
       tmp1 = Can[j] - G[j+1,j+i]
       tmp2 = Can[j+i] - G[j,j+i-1]
       if (tmp1>tmp2)
       {
             F[j,j+i] = 0;
             G[j,j+i] = tmp1;
       }
       else
       {
             F[j,j+1] = 1;
             G[j,j+i] = tmp2;
       }

很抱歉缺少注释,但是如果您阅读了一些有关动态编程的文章,则可以毫无问题地得到它。

10-02 04:01
查看更多