我正在查看平衡分区问题here和here (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)|
我的做法有什么问题?它似乎通过了我能提出的所有测试用例。
答案 0 :(得分:1)
简单的反例是[1,1,1,1,1,1,6]
。贪婪的方法会在两组之间传播,最佳解决方案是[1,1,1,1,1,1]
,[6]
。
答案 1 :(得分:0)
您的实施和方法没有任何问题。但是,如果您考虑此特定问题中的所有子集,您可能会找到比贪婪输出更好的答案。即使在您共享的Wiki页面中也有一些示例。
可能你已经知道这两种方法之间的区别。虽然,贪婪的算法总会给你一个非常好的结果,如此接近或者可能等于最好的结果,你必须考虑所有选项以确定。动态编程方法以某种方式检查所有可能的子集。由于它可以保存先前计算出的子问题的结果,因此它基本上比暴力强制更快。
问题是何时使用贪婪或动态编程方法。我做了一些有竞争力的编程,当我看到DP问题(分区,子集和背包等问题)时,我有时会立即提出一个贪婪的解决方案,因为大多数时候它们更明显。人们在日常生活中一直使用贪婪的方法。在实现之前,我用示例测试我的算法,如果我说服自己这是正确的方法,我实现它。它在某种程度上是直观的。
如果您发现应该有更好答案的测试用例,很可能意味着您必须找到DP解决方案。如果从判断系统获得WA,则意味着您没有找到好的测试用例,但是没有必要找到确切的测试用例,因为它无法帮助您找到更好的解决方案。