【发布时间】:2016-02-27 12:49:43
【问题描述】:
我正在尝试使用带有记忆的递归来做到这一点,我已经确定了以下基本情况。
I) 当 n==k 时,只有一组拥有所有球。
II) 当 k>n 时,任何组都不能有至少 k 个球,因此为零。
我无法从这里继续前进。如何才能做到这一点?
当 n=6 ,k=2 时举例说明 (2,2,2) (4,2) (3,3) (6)
即可以形成4个不同的分组。
【问题讨论】:
-
尝试提出一个分区可能性的声明,例如“每个有效的解决方案都包含一个___和一个___”。如果第一个 ___ 是“简单”对象,则最简单。这个想法是,我们可以通过计算第一个___的每个选择的解决方案数量,然后将它们加在一起来计算解决方案的总数。这也意味着不能将任何解决方案计算两次(即,在第一个___的两个不同选择下)。
-
例如如果问题是计算排序 n 项列表的方式的数量,我们可以说,“n 项的每个排序都由其中一项组成,然后是剩余 n-1 项的排序。”这具有避免重复计算的重要特性:它将排序根据它们的第一项划分为 n 个桶,并且由于任何特定的排序都只有一个第一项,因此它将只计算一次。计算 n-1 项的顺序很容易——可以使用我们刚刚编写的计算 n 项的顺序的相同函数来完成! :)
-
在这个特定问题中,如何划分解决方案不太明显,因为组的顺序无关紧要——也就是说,(4, 2) 与 (2, 4),所以它应该只计算一次。 (顺便说一句,你应该在你的问题中明确说明这一点。)你能以某种方式修改问题来解决这个问题吗?提示:对于大多数解决方案,组列表可以按许多不同的顺序编写;如果有一种简单的方法可以从该集合中选择一个特定的顺序,您可以简单地计算解决方案的 此类顺序 的数量...
标签: algorithm combinations dynamic-programming