我写信是否有人知道如何解决这个问题。我不需要代码,我只是喜欢这背后的逻辑。所以我有一套{A,B,C,D,E}。现在我想在集合中的值中找到和或运算符的所有组合。
下面的一些例子。
A and B and C and D and E
A and B and C and D or E
A and B and C or D and E
据我所知,在上述情况下有2 ^ n-1种可能性。因此,在上面的具体示例中,我们将有8种组合。
除了以上之外,集合中的值可以有两种可能性。为简单起见,可以说A可以是真或假。同样地,B,C,D和E.所以我们可能具有以下内容:
A=True and B=True and C=True and D=True and E=True
A=True and B=True and C=True and D=True and E=False
A=True and B=True and C=True and D=True or E=True
等等。因此,考虑到这一点,我们将有2 ^(2 * n-1)种组合。所以在我们上面的具体例子中,我们将有一组4的16种组合。
是否有算法已经执行此操作?如果不是,任何人都有一些逻辑在Java中实现它
谢谢,
答案 0 :(得分:0)
我认为你想要枚举(可能是打印)所描述的表单的所有不同表达式,对于某些集合大小n
。由于每一个都可以通过一组标志来表征(= 1号位置的真实vs =假... n
,以及位置1 ...和n - 1
的和vs或者),你可以代表每一个表达式为整数,每个标志对应一个(二进制)位。如果n具有您希望显式枚举所有可能性的值,则此类整数将完全在Java long
的范围内。为了舒适地能够枚举所有可能性,这样的整数将在Java int
的范围内。
因此,一种方法是编写一种方法,根据位模式将范围内整数解码为表达式。然后,您可以迭代所有适当的整数(即0
... (1 << (2 * n)) - 1
),并将每个整数解码为相应的表达式。
答案 1 :(得分:0)
如果你必须得到五个布尔值的组合,你可以做一件事 -
我希望下面的代码会有所帮助:
import java.util.ArrayList;
public class Test{
public static void main (String[] args)
{
ArrayList<boolean[]> result = new ArrayList<boolean[]>();
int max_num = Integer.parseInt("11111", 2);
for(int i=max_num; i>=0; i--)
{
String val = String.format("%5s", Integer.toBinaryString(i)).replace(' ', '0');
boolean[] arr = new boolean[5];
char[] charArray = val.toCharArray();
for(int j=0; j<charArray.length;j++)
{
if(charArray[j]=='1')
{
arr[j]=true;
}
else
{
arr[j]=false;
}
}
result.add(arr);
arr=null;
val=null;
}
for(int i=0;i<result.size();i++)
{
for(boolean b: result.get(i))
{
System.out.print(b+" ");
}
System.out.println();
}
}
}
要更改变量计数: