家庭作业:动态编程 - 查找整数数组的最佳子集分配

时间:2016-04-07 16:46:34

标签: algorithm

我不确定这是否是提问作业问题的地方 - 如果不是,我道歉。并且要提前做到这一点,我不想要答案,只是思考这个问题的方法。

假设我有一个n整数数组,它表示沿着直线轴的村庄的位置。现在,我被允许建造k个厕所,k预先确定n >= kk。我必须建造n = 5厕所,使每个村庄和最近的厕所之间的距离总和最小化。

如何找到分配的最小可能值?

一个简单的例子:
村庄:[0,1,2,3,4],k = 1
厕所(最佳):[2],如果k = 2因此使得和= 6,则为Sum([| 0-2 |],[| 1-2 |],[| 2-2 |],[ | 3-2 |],[| 4-2 |])
厕所(最佳):[1,3]如果k因此使得和= 3,作为Sum([| 0-1 |],[| 1-1 |],[| 2-1 |], [| 3-3 |],[| 4-3 |])

现在,我想到的一种方法是使用递归生成所有可能的配置。然后,对于每个马桶配置,计算最小距离,并选择最小距离。

如果n40 C 15保持较小,则有效。但是假设我有40个村庄和15个厕所可供分配。这使问题变得笨拙,因为它突然变成了40225345056<dbReference type="PM" id="17224074"/> <dbReference type="DOI" id="10.1186/bcr1637"/> </citation> <scope>VARIANTS ILE-282 AND ASN-777</scope> </reference> <comment type="function"> <text evidence="24">Calcium.</text> </comment> <comment type="function"> <text evidence="24">Has a strong inhibitory effect on APP C99 and C83 production.</text> </comment> <comment type="subunit"> <text evidence="5 13">Homodimer; disulfide-linked.</text> </comment> <comment type="interaction"> <interactant intactId="EBI-727477"/> <interactant intactId="EBI-7644904"> <id>Q9JIY2</id> <label>Cbll1</label> </interactant> <organismsDiffer>true</organismsDiffer> <experiments>21</experiments> </comment> 大小的问题。

我觉得它与动态编程有关,但我似乎无法将动态编程的概念归结为当前的问题。

同样,重申一下,请不要将答案传给我,而是以不同方式提出问题。

1 个答案:

答案 0 :(得分:1)

我认为首先你需要找出基本的问题:当你有N个村庄,你必须建造一个厕所,在哪里建造它。

你的N应该从1开始。然后2,3 ...

接下来,你将在N个村庄中建造2个厕所。我认为很明显,您需要将村庄分为两组,分别使用两个厕所。

问题变成了如何将村庄分成两组。 在这种情况下,也从1开始N,然后是2,3 ......

让您的算法适用于N(任何正整数)和2个厕所。

一旦你走到这一步,我想你可以继续使用3个厕所。问题可能已经解决了。如果没有,我相信一旦你可以在N个村庄建造3个厕所,你就可以建造M(M <= N)个厕所。

这里的基本方法是:从最简单的情况开始并解决它,然后逐步增加问题的复杂性,并确保您的解决方案能够处理增加的复杂性。递归听起来像是一个很好的方式。在真正成为问题之前,不要担心性能问题。首先解决问题,稍后进行优化。

祝你好运!