【问题标题】:choose k items from a set of x and y to meet certain criteria从一组 x 和 y 中选择 k 个项目以满足特定条件
【发布时间】:2012-02-21 06:58:48
【问题描述】:

我已经给了xy项目,我需要选择一些x和一些y,并有一些限制,比如x < 10y < 5,总数应该是p

如何解决此类问题。算法/数学技术。

【问题讨论】:

  • 总数应该是k还是p?
  • 我猜这里有更深层次的语言问题。您是否有 x 项或 (0 到 x) 的值与 y 相同?项目的数量或它们的值的总和是否必须是 p?您需要总和为 p 的对 (x+y) 还是每个组合 (x1 + x2, ... + xn + y1, + y2 + ... + ym) = p?

标签: algorithm math probability


【解决方案1】:

诀窍是我们只需要遍历一个数组(例如 x_array),我们可以使用 p-x=y 计算出 y。现在我们只需要确保 y 在 y_array 中并且我们知道我们有我们的答案。为了确保 y 在 y_array 中,我们创建了一个集合或二叉搜索树以进行快速查找。

这是一些python代码:

p=13
xs=[1,3,99,9,18]
ys=[10,4,33]

y_set=set(ys)

#y=p-x
results=((x,p-x) for x in xs if x<10 and p-x<5 and p-x in y_set)

print "x=%s,y=%s,p=13" % results.next()
'x=9,y=4,p=13'

【讨论】:

    【解决方案2】:

    您是否正在尝试做这样的事情:

    void main(void) {
         int x[] = {3, 5, 7, 10}
        int y[] = {5, 9, 12, 23}
        int i=0, j=0;
            for(i=0; i<4; i++)
            {
            for(j=0; j<4; j++)
            {
                if (x[i]<10 && y[j]<5)
                {
                    if(x[i]+y[j]==p)
                    {
                        //do something
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 没有 y 小于 5。:) 如果您在迭代 j 之前测试 x[i]
    【解决方案3】:

    我知道最快的算法是:

    1. m 是您的约束的最大值,z 是由m 约束的项目。在你的情况下m = 10, z = x。这是因为随着 m 的增长,p - m 会减小。
    2. 我认为您的项目是通用的。创建映射并将键 p - z[i].value() 关联到 z[i]
    3. 在另一个列表中获取每个项目obj(在您的情况下为y),并查看obj.value() 是否是您的地图的键。如果是,请同时保存 obj.value()map[obj.value()]

    使用在恒定时间O(1) 在地图中检索的属性,您有一个在O(sizeof(x)+sizeof(y)) 中运行的算法

    【讨论】:

      猜你喜欢
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多