摘要: 子集和是一个很著名的问题,一个集合S{s1,s2,s3,s3,...,sn}, 给一个数s,问是否存在一个S的一个或多个子集,使得该子集内所有元素的和等于给出的数.显然利用一个辅助的数字x[],可以在O(2^n)时间复杂度内完成搜索出所有的解.当如果要问存在多少个子集能够组成目标数字. 我们可以利用动态规划的方法来得到答案, 这样时间和空间复杂度是O(s*n), s是目标数字, n是备选集合的元素个数.动态方程是: f(i, j) =f(i-1, j) + f(i-1, j-S[i-1]) + (j==S[i]). 其中i从1到n, j从1到s.最终结果f(n,s)就是可以组成s的子集个数.- 阅读全文
posted @ 2012-08-02 11:35 xxx's blog 阅读(305) 评论(0) 推荐(0) 编辑