【问题标题】:Integer partitioning in JavaJava中的整数分区
【发布时间】:2017-06-04 22:14:26
【问题描述】:

我正在尝试实现一个程序,该程序返回整数 n 的现有分区数作为赋值的一部分。我写了下面的代码,但是它返回了错误的数字(Partitions n 返回了 Partitions n-1 的结果)。我不明白为什么会这样。试了很多方法还是不知道怎么解决,有大神能帮帮我吗?

[edited code out to avoid plagiarism from my colleagues :p]

m 代表分区中允许的最大数,因此 partition(4,4) 将是 5 = 4, 3+1, 2+2, 2+1+1, 1+1+1+1,但是分区 (4,1) 将是 1 = 1+1+1+1。 执行:java 分区 n

【问题讨论】:

  • @JacobG。正整数 n 的分区是将 n 写为正整数之和的一种方式。仅在其被加数的顺序上不同的两个和被认为是相同的分区。更多:en.wikipedia.org/wiki/Partition_(number_theory)
  • else if (n <= 1 | m == 1) 应该是else if (n <= 1 || m == 1)
  • @KevinO 不应该影响程序的行为
  • 您将partition 编写为两个整数nm 的函数(除了记忆数组,它还存储两个整数的函数)。我相信你有充分的理由这样做,但我们其他人不知道你的 partition(n,m) 的定义是什么。
  • 我正在编辑问题以澄清它。 m 代表分区中的最大数,因此 partition(5, 5) 将是 7 = 5, 4 +1, ... 1 + 1 + 1 + 1 + 1 并且 partition (5, 1) 将是 1 = 1 + 1 + 1 + 1 + 1 我这样做是因为分配是从introcs.cs.princeton.edu/java/23recursion/Partition.java.html 派生的,他们在那里这样做

标签: java recursion dynamic-programming partitioning integer-partition


【解决方案1】:

假设你打电话给partitions(4,4,memo)。正如你所说,答案应该是 5,因为有 5 种方法来划分整数:

4
3 + 1           <== counted by partition(1,3,memo)
2 + 2           <== counted by partition(2,2,memo)
2 + 1 + 1       <== counted by partition(2,2,memo)
1 + 1 + 1 + 1   <== counted by partition(3,1,memo)

所以看起来您的算法试图以上面显示的方式计算分区...但是您是否忘记计算一个分区?

【讨论】:

  • 请注意如何修复它——我第一次尝试时没有成功。特别是partition(4,2)需要返回3。
  • 解决它的简单方法是在 main 解析它之后立即将 1 添加到 n,但我猜这是懒惰的方式。我现在正在努力寻找另一个
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 2017-10-28
  • 2020-06-05
  • 1970-01-01
  • 2012-05-10
  • 2013-09-01
  • 2016-08-02
相关资源
最近更新 更多