Algorithm 分布珠子的算法(2)?
假设您有一个带有N插槽的圆(如下所示)。 您的目标是在每个插槽中放置指定数量的珠子,并且您有一个大小为N的数组,其中包含每个插槽中所需珠子的数量。例如,如果数组为{1,5,3},则需要在插槽1中包含1个珠子,在插槽2中包含5个珠子,在插槽3中包含3个珠子。你有无限多的珠子 您可以“解锁”X插槽。解锁插槽后,可以开始将珠子放入该插槽。可以移动已在插槽中的珠子,但只能顺时针移动 为了解决问题,珠子必须移动的最小距离是多少 下面是一个例子: N=6,X=2。数组:{2,5,4,2,6,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
解锁插槽2和5。将11个胎圈放入槽2中,并行驶8的总距离到达槽2、3和4。将10个珠子放入槽5中,并移动总距离6,以到达槽5、6和1。8+6=14,所以答案是14。这个问题需要注意:
- 将珠子移动到(或超出)另一个解锁插槽没有任何好处,因为如果这些珠子在该另一个解锁插槽中开始移动,则移动的次数将更小李>
- 因此,一旦选择了要解锁的插槽,就要确定要放入这些插槽中的珠子数量和移动次数李>
- 如果已经为一组特定的解锁插槽计算了成本(移动次数),则可以很容易地导出相邻配置(其中先前解锁的插槽保持锁定,但下一个插槽解锁)的成本,而无需从头开始计算李>
- 在最佳解决方案中,必须接收最多bean的插槽并不总是解锁的李>
- 如果一个插槽选择保持可变,则成本将在选择下一个插槽的方向上增加或减少,这是不正确的;它可以上上下下,上上下下
函数优化收集器(beadCounts、collectorCount){
//初始化
var n=beadCounts.length;
if(n
每个插槽的珠子数的逗号分隔列表:
随机化
胎圈收集槽的数量:
找到收集器插槽以最小化成本
你能告诉我你的算法的复杂度吗?对不起,我不擅长阅读JS代码。时间复杂度是O(n!/[(n-x)!x!])。我知道这不是最优的,但这是一个开始。