Math 在给定行和列和的情况下查找二进制矩阵是否存在

Math 在给定行和列和的情况下查找二进制矩阵是否存在,math,tomography-reconstruction,Math,Tomography Reconstruction,如何找出是否可以用给定的行和列和构造二元矩阵 输入: 第一行输入包含两个数字1≤m、 n≤1000,矩阵的行数和列数。下一行包含m个数字0≤ri≤n–矩阵中每行的总和。第三行包含n个数字0≤希杰≤m–矩阵中每列的总和 输出: 如果存在m×n矩阵A,且每个元素为0或1,则输出“是”。否则“不” 我试着阅读有关层析成像算法的文章,但没有找到答案,因为所有与层析成像算法相关的论文都非常复杂 有人能帮帮我吗?我已经成功实现了使用基于的建模为R随机生成这样的矩阵。我打算有一天把这些想法写下来,但还没有找到

如何找出是否可以用给定的行和列和构造二元矩阵

输入:

第一行输入包含两个数字1≤m、 n≤1000,矩阵的行数和列数。下一行包含m个数字0≤ri≤n–矩阵中每行的总和。第三行包含n个数字0≤希杰≤m–矩阵中每列的总和

输出:

如果存在m×n矩阵A,且每个元素为0或1,则输出“是”。否则“不”

我试着阅读有关层析成像算法的文章,但没有找到答案,因为所有与层析成像算法相关的论文都非常复杂


有人能帮帮我吗?

我已经成功实现了使用基于的建模为R随机生成这样的矩阵。我打算有一天把这些想法写下来,但还没有找到时间。为了寻找答案,我读了米克洛斯和波达尼的文章:

-定理(,)指出存在一个0和1的矩阵Xn,m,行总数为a0=(a1,a2,…,an),列总数为b0=(b1,b2,…,bm),因此bi≥ 每0 我想这应该是递归决定你的问题的最好方法

用我自己的话来说:选择任何一行,将其从总计列表中删除。打那个号码k。也可以从k列中减去1,并使用较大的总和。获得较小矩阵的描述,然后递归。如果在任何一点上都没有k列的非零和,那么就不可能存在这样的矩阵。否则,您可以使用相反的过程递归地构建匹配矩阵:获取递归调用返回的矩阵,然后再添加一行k个,放置在最初从其计数中减去1的列中

实施
bool可满足(标准::向量a,标准::向量b){
而(!a.empty()){
排序(b.begin(),b.end(),std::greater());
int k=a.back();
a、 向后弹出();
如果(k>b.size())返回false;
如果(k==0)继续;
如果(b[k-1]==0)返回false;
for(int i=0;i
谢谢您的回答。虽然你的回答在我看来是正确的,但我能部分理解。那么,请用C语言、C++语言或java语言解释我的小代码。或者举个例子?有没有什么最佳的方法可以做到这一点?在每次迭代中,列的数组都会被排序,如果输入的数量级是10^9,那么每次迭代都会花费很多时间。有没有什么方法或二进制矩阵的性质可以帮助我们在o(n)中实现这一点?我对此有些费解,但还没有找到任何方法。提前感谢您的帮助。@Hitesh在每次迭代结束时,您将得到两个有序子集。然后,通过使用合并排序,可以在O(n)而不是O(nlogn)中执行新排序。但是全局复杂度仍然很大。我在这个线程上找到了解决这个问题的有效算法