c - 集合动态规划

标签 c algorithm dynamic-programming

我有一个动态规划中的典型问题。

我的问题是给定一个数组 = {1,2,3,4,5,6},我必须找到所有其和至多为 k 的数组。如果我考虑所有的集合,它将变成指数算法。我想到了通过动态编程来实现这一点。

Suppose f k =7,
My idea is 
Pass 1: {1],{2}....{6}
Pass 2: Pass1 + {1,2},{1,3},{1,4},{1,5}
Pass 3: Pass2 + {1,2,3},

我的算法停止了。

我无法用动态规划来表达这个。任何输入??如何将这个算法转化为程序?

最佳答案

问题的 DP 解决方案应遵循下一个递归公式,并自下而上构建:

f(i,0) = {{}} //a set containing only an empty set
f(0,W) = {{}} (W > 0)
f(0,W) = {} (W < 0) //an empty set
f(i,W) = f(i-1,W) [union] extend(f(i-1,w-element[i]),element[i])

函数 extend(set,e) 是:

extend(set,e):
   for each s in set: //s is a set itself
      s.add(e) 

请注意,复杂度仍可能是指数级的(甚至不是伪多项式),因为生成的集合数量可能是指数级的,并且存储在 DP 表中。

关于c - 集合动态规划,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18145179/

相关文章:

c - C 中参数数量未知的函数

c - 如何将结构初始化为空?

c - 不正确的十进制到十六进制转换 - C

c - 有什么干净的方法可以让 OpenMP pragmas 与宏一起工作?

python - 从列表序列中提取数据以放入变量中

algorithm - 如何在 O(2^n) 内存和 O(2^n *n) 时间中检查哈密顿行走是否存在

string - 可以使一组字符串唯一的最少字符数

javascript - javascript中对象数组的笛卡尔积

algorithm - 该算法是否涵盖了寻找总和的最小硬币变化的所有情况?

c# - 关于找到解决此问题的标准制表方法的任何建议