我正在解决离散数学中的一个问题,如果可能的话,我需要找到一个最优的解决方案(不是2 ^ n)。
我有一个矩阵
让我们说
.. 0 1 2 3 4
0 1 1 0 0 0
1 0 0 0 1 1
2 1 1 1 0 0
3 0 1 1 1 1
是否可以找到给出5 [1]:1 1 1 1 1的所有行组合而不检查每个组合?
我考虑过在另一个矩阵中对这个矩阵进行排序,其中有更多行,其中第一行是第一个矩阵的行,第一列为1
例:
..0 1 2 3 4
.0 1 1 0 0 0 - 这已经是第1列[1]
.1 1 1 1 0 0 - 这已经列1 [1]
.2 1 1 0 0 0 - 这已经有第2栏[1]
..3 1 1 1 0 0 - 这已经有第2栏[1]
..4 0 1 1 1 1 - 这已经有第2栏[1]
..5 1 1 1 0 0 - 这已经有第3栏[1]
..6 0 1 1 1 1 - 这已经有第3栏[1]
.0 0 0 0 1 1 - 这已经有第4栏[1]
..8 0 1 1 1 1 - 这已经有第4栏[1]
.90 0 0 0 1 1 - 这已经是第5栏[1]
10 0 1 1 1 1 - 这已经列5 [1]
现在要将所有给出行的行组合为5 [1]
给出5 [1]的行的组合意味着:
将0和1视为假和真实
看着第一个矩阵:
第0行:1 1 0 0 0 +第3行0 1 1 1 1
在这种情况下,“+”表示“或”:
所以:第0行+第3行给出了五个ONES的组合
并且有很多共同点
有什么想法吗?
答案 0 :(得分:2)
我会为每列创建一组行,在该列中有1行。在我们的例子中,我们将有5组5列:
0:{0,2}
1:{0,2,3}
2:{2,3}
3:{1,3}
4:{1,3}
创建一个在所有列中生成1的组合,只需从每个集合中选择一个项目。创建所有组合就像循环遍历所有集合一样简单,并忽略已经找到的组合。