【问题标题】:products of values in each set of powerset每组幂集的值的乘积
【发布时间】:2013-08-06 16:38:35
【问题描述】:

给定一个数组,假设数组 = [ 1,2,3]

我想找出每组powerset中的所有products值。

例如,

幂集是

{null}
{1} - 1
{2} - 2
{3} - 3
{1,2}- 2
{2,3}- 6
{1,3}- 3
{1,2,3}- 6

符号:集合后跟集合中值的乘积

如何使用动态编程来实现这一点。

注意:

我试过这个方法,发现powerset by

void printPowerSet(int *set, int set_size)
{
    /*set_size of power set of a set with set_size
      n is (2**n -1)*/
    unsigned int pow_set_size = pow(2, set_size);
    int counter, j;

    /*Run from counter 000..0 to 111..1*/
    for(counter = 0; counter < pow_set_size; counter++)
    {

     int product=1;
      for(j = 0; j < set_size; j++)
       {
          /* Check if jth bit in the counter is set
             If set then pront jth element from set */
          if(counter & (1<<j))
           product *= counter;
       }
      printf("%d", product);
    }
}

这种技术工作得很好,但是对于小数组,(数组大小

【问题讨论】:

  • 我怀疑 DP(自下而上)会改善答案,DP 的想法通常是建立从低到高的所有可能性,并标记哪些是有效的。然而,在这里,可能性的范围是[1,x1*x2*...*xn] - 这比2^n 更糟糕,假设所有(可能除了一个值)x_i &gt;= 2
  • @amit:好吧,他不必那样做;您不会使用该范围内的所有内容。有一种方法可以做到这一点,最坏的情况是使用不同产品的数量(嗯,O(number of distinct products))。
  • @DennisMeng 我们如何在 O(不同产品的数量)中实现这一目标
  • 我会用伪代码发布答案;如果我尝试发表评论,那就太混乱了。
  • pow(2, set_size); - awwwwww....! 1 &lt;&lt; set_size FTW!

标签: c algorithm dynamic-programming


【解决方案1】:

假设您的输入集是 S 并具有 size 元素。这样的事情会起作用:

make an empty set A
for every element s in S {
    make an empty set B
    for every t in A {
        add s*t to B
    }
    A = union of A and B
}

一次使用的总内存最多是两个集合大小的总和,所以O(number of distinct products))。您的“子问题”将是“使用集合的第一个 x 元素可以获得哪些产品?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多