平衡分区贪婪的方法

时间:2017-03-06 23:20:14

标签: algorithm dynamic-programming greedy

我正在查看平衡分区问题herehere (problem 7)

该问题基本上要求将给定的数字数组划分为2个子集(S1和S2),使得数字和之间的绝对差值为S1和S2 import React from "react"; const StoreShell = React.createClass({ render(){ return( <div className="theBigWrapper"> {React.cloneElement(this.props.children, this.props)} </div> ) } }) export default StoreShell; 需要最小。我不明白的一件事是为什么没有人建议贪婪的方法:

|sum(S1) - sum(S2)|

我的做法有什么问题?它似乎通过了我能提出的所有测试用例。

2 个答案:

答案 0 :(得分:1)

简单的反例是[1,1,1,1,1,1,6]。贪婪的方法会在两组之间传播,最佳解决方案是[1,1,1,1,1,1][6]

答案 1 :(得分:0)

您的实施和方法没有任何问题。但是,如果您考虑此特定问题中的所有子集,您可能会找到比贪婪输出更好的答案。即使在您共享的Wiki页面中也有一些示例。

可能你已经知道这两种方法之间的区别。虽然,贪婪的算法总会给你一个非常好的结果,如此接近或者可能等于最好的结果,你必须考虑所有选项以确定。动态编程方法以某种方式检查所有可能的子集。由于它可以保存先前计算出的子问题的结果,因此它基本上比暴力强制更快。

问题是何时使用贪婪或动态编程方法。我做了一些有竞争力的编程,当我看到DP问题(分区,子集和背包等问题)时,我有时会立即提出一个贪婪的解决方案,因为大多数时候它们更明显。人们在日常生活中一直使用贪婪的方法。在实现之前,我用示例测试我的算法,如果我说服自己这是正确的方法,我实现它。它在某种程度上是直观的。

如果您发现应该有更好答案的测试用例,很可能意味着您必须找到DP解决方案。如果从判断系统获得WA,则意味着您没有找到好的测试用例,但是没有必要找到确切的测试用例,因为它无法帮助您找到更好的解决方案。