Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 分布珠子的算法(2)?_Algorithm_Dynamic Programming_Graph Theory_Knapsack Problem - Fatal编程技术网

Algorithm 分布珠子的算法(2)?

Algorithm 分布珠子的算法(2)?,algorithm,dynamic-programming,graph-theory,knapsack-problem,Algorithm,Dynamic Programming,Graph Theory,Knapsack Problem,假设您有一个带有N插槽的圆(如下所示)。 您的目标是在每个插槽中放置指定数量的珠子,并且您有一个大小为N的数组,其中包含每个插槽中所需珠子的数量。例如,如果数组为{1,5,3},则需要在插槽1中包含1个珠子,在插槽2中包含5个珠子,在插槽3中包含3个珠子。你有无限多的珠子 您可以“解锁”X插槽。解锁插槽后,可以开始将珠子放入该插槽。可以移动已在插槽中的珠子,但只能顺时针移动 为了解决问题,珠子必须移动的最小距离是多少 下面是一个例子: N=6,X=2。数组:{2,5,4,2,6,2} 解锁插槽2

假设您有一个带有N插槽的圆(如下所示)。 您的目标是在每个插槽中放置指定数量的珠子,并且您有一个大小为N的数组,其中包含每个插槽中所需珠子的数量。例如,如果数组为{1,5,3},则需要在插槽1中包含1个珠子,在插槽2中包含5个珠子,在插槽3中包含3个珠子。你有无限多的珠子

您可以“解锁”X插槽。解锁插槽后,可以开始将珠子放入该插槽。可以移动已在插槽中的珠子,但只能顺时针移动

为了解决问题,珠子必须移动的最小距离是多少

下面是一个例子:

N=6,X=2。数组:{2,5,4,2,6,2}


解锁插槽2和5。将11个胎圈放入槽2中,并行驶8的总距离到达槽2、3和4。将10个珠子放入槽5中,并移动总距离6,以到达槽5、6和1。8+6=14,所以答案是14。

这个问题需要注意:

  • 将珠子移动到(或超出)另一个解锁插槽没有任何好处,因为如果这些珠子在该另一个解锁插槽中开始移动,则移动的次数将更小
  • 因此,一旦选择了要解锁的插槽,就要确定要放入这些插槽中的珠子数量和移动次数
  • 如果已经为一组特定的解锁插槽计算了成本(移动次数),则可以很容易地导出相邻配置(其中先前解锁的插槽保持锁定,但下一个插槽解锁)的成本,而无需从头开始计算
  • 在最佳解决方案中,必须接收最多bean的插槽并不总是解锁的
  • 如果一个插槽选择保持可变,则成本将在选择下一个插槽的方向上增加或减少,这是不正确的;它可以上上下下,上上下下
这里建议的算法将遍历所有可能的插槽选择,并选择移动次数最少的组合。因此,时间复杂度为O(n!/[(n-x)!x!])

我认为应该有一个更有效的算法,它不需要访问所有的组合,但我没有找到任何数学模式,将允许这一点

以下是JavaScript代码片段中的算法:

函数优化收集器(beadCounts、collectorCount){
//初始化
var n=beadCounts.length;
if(n
每个插槽的珠子数的逗号分隔列表:
随机化
胎圈收集槽的数量:

找到收集器插槽以最小化成本

你能告诉我你的算法的复杂度吗?对不起,我不擅长阅读JS代码。时间复杂度是O(n!/[(n-x)!x!])。我知道这不是最优的,但这是一个开始。