求教一个数学问题
一个200×200的矩阵,每个单元只有0和1两种情况。
现在给出:
1.每一行1的个数
2.每一列1的个数
3.每条斜线(与对角线平行的线)上的1的个数。
有什么算法(除穷举法之外)可以还原这个矩阵?
能回答者要我付钱也可以!拜托!!!
[解决办法]
解方程是很简单,比如n^2个变量,消去大概6n个变量,余下n^2-6n个变量,但是不是说余下n^2-6n个变量随便选择就可以是合法的解,这个是因为我们要求每个变量都是0或1(包含被消去的变量)。
而对于这n^2-6n个变量,如果你继续采用试探的方法,那么还是有2^(n^2-6n)种不同可能,所以复杂度还是太高,这种方法意义不大。
这儿问题主要问题还在于问题本身复杂度很高,如果情况不是很特殊,估计解的数目会非常之多。
另外这个问题应该属于0-1规划问题
[解决办法]
一个根据概率猜测做贪心算法
//在基本快速排序里有个试验,在有大量重复元素时,进行划分出中值,这个是一个合理的方案,//就这个思路加入剔除和中值相等的元素操作.void _sort_kn_2(pVT pDest,SIZE_T n){ if(n < 2) return ; if(n < 32){ _insert_sort(pDest,n); return ; } SIZE_T i = __divide_min(pDest,n,find_rand(pDest,n)); _sort_kn_2(pDest,i); n -= i; pDest += i; if(n < 2) return ; if(n < 32){ _insert_sort(pDest,n); return ; } i = find_rand(pDest,n); if(*pDest == *(pDest + i))//如果第二次随机值仍然相同,由于是随机值,两次都相同因此大致考虑为和中值相等的值较多,可以考虑剔除相等的.//如果不同,则看成是对这部分进行了一次划分.//这里可以注意的,这里随机选值包含了上一次划分剩下的那个中值.//如果比较相等比较多花销,可以考虑把那个剔除,但程序稍微复杂点. i = __divide_equal(pDest,n,0); else{ i = __divide_min(pDest,n,i); _sort_kn_2(pDest,i); } _sort_kn_2(pDest + i + 1,n - i - 1);}void sort_kn_2(pVT pBeg,pVT pEnd){ if(pBeg + 1 < pEnd) _sort_kn_2(pBeg,pEnd - pBeg);}//晚上考虑递归深度问题.