问题是找到一个矩阵,该矩阵给出了行和列总和并且最小数量的非零元素。给定两个正整数数组A[1...N]
和B[1...M]
,sum(A)=sum(B)
。阵列A和B分别是未知NxM矩阵的行和列和。矩阵的元素是非负整数。
这在多项式时间内是否可行?
等效公式 - 创建一个最小尺寸的多组C,可以从A和B中创建,通过"分解较小的数字"。多组C与矩阵中的非零元素相同。 C大小的明显下限和上限是:
max(|A|, |B|) <= |C| <= N+M-1
答案 0 :(得分:0)
如前所述| C | &lt; = N + M - 1
但是,假设你可以将A和B分成A1,A2和B1,B2使得sum(A1)= sum(B1)和sum(A2)= sum(B2),约束变小
|C| <= (|A1| + |B1| -1) + (|A2| + |B2| -1)
<= N + M - 2
因此问题的目标是将A和B分成最大数量的分量A1,A2,...... Ak和B1,B2,... Bk,使得和(Ai)=和(Bi)。在这种情况下:
|C| <= N + M -1 -k
我认为没有多项式解决方案。但是下面的启发式方法可能有用。
第1步:排序A和B
步骤2:找出A和B之间的共同元素,并将它们移动到自己的组件中
步骤3:在A中找到两个元素的集合,它们与B中的元素相加并将它们移出。对B中与A
中的元素求和的两个元素执行相同的操作第4步:....
正如您所看到的,随着组件的大小不断增加,它变得越来越难。但我不确定是否有更好的解决方案。