【发布时间】: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 >= 2。 -
@amit:好吧,他不必那样做;您不会使用该范围内的所有内容。有一种方法可以做到这一点,最坏的情况是使用不同产品的数量(嗯,
O(number of distinct products))。 -
@DennisMeng 我们如何在 O(不同产品的数量)中实现这一目标
-
我会用伪代码发布答案;如果我尝试发表评论,那就太混乱了。
-
pow(2, set_size);- awwwwww....!1 << set_sizeFTW!
标签: c algorithm dynamic-programming