一个复杂的问题,大家探讨探讨。

swimming8243 2009-08-27 09:05:59
是这样的,有一组未知数数组A(A1,A2,A3...An)和一组已知数数组B(B1,B2,B3...Bm)。其中B数组均是正整数,要根据以下不等式组求的A数组所有元素的值,其中A数组所有元素只能取0或者1,不等式组如下:
B1< A数组任意几个数之和 <B1+1
B2< A数组任意几个数之和 <B2+1
.....
Bm< A数组任意几个数之和 <Bm+1

其中有几个约定:1,不等式的数量和B数组个数相等;2,不等式的最小最大值分别是同一个B数组值和该值+1,也就是=该值 或者=该值+1;3,A数组的每个值必然会出现在这一组不等式之间,只是出现的次数不定;4,不等式中间的那个“A数组任意几个数之和”的变量个数肯定大于该不等式的最大值数目,不会出现全部是1都不能使不等式成立的可能。

目前就是如果数量少哪怕用穷举也不难,就是目前A数组和B数组的数量都很巨大,都可能接近10W,而且有可能无解,有可能无数解,不知道高手们有什么好的想法能够运算快一些,如果有好的想法就可以给分。
...全文
297 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
swimming8243 2009-11-30
  • 打赏
  • 举报
回复
结贴吧,没什么好的方法。
背包算法倒是能给我一些帮助。
分数大家平分了吧
fire_woods 2009-10-16
  • 打赏
  • 举报
回复
老实说我没看懂....
A数组任意几个数之和实在是很难理解.
swimming8243 2009-10-16
  • 打赏
  • 举报
回复
呵呵,最近比较忙,忘记来更新了。
先回复一下donkey301
其实用矩阵我也想到类似的,虽然没有想通,但是我认为用矩阵可能能找出解法。

但是另外一点事最麻烦的,就是这个矩阵非常大,一般的机器内存可能吃不消。如20000*10000的矩阵。

不知其他高手还有什么思路,目前我的解决方法和背包问题的递归有些类似,做了一些实际需求的优化,但是即使是5000*500的矩阵,解决仍然要10~15分钟左右出现解,如果要列举所有解估计没有若干小时搞不定。20000*10000的矩阵…………
LPR_Pro 2009-08-31
  • 打赏
  • 举报
回复
UP
FlyinFish 2009-08-30
  • 打赏
  • 举报
回复
假设N <= A数组任意几个数之和 <= M 中,M取最小值,N取最大值

如果A数组中有0的话则N的最大值为0,如果A数组中全都是1的话N的最大值为1
M的最小值为 (A1+A2+...+An)

如果M-N > 1则无解
如果 M = N,只有两种可能,数组A = {0} 或者 {1}
如果 M-N = 1, 也只有两种可能,数组 A = {0,1} 或者 {1,1}

不知道我理解的对不对?

zhangrenhui 2009-08-28
  • 打赏
  • 举报
回复
UP
whg01 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 peacefulby 的回复:]
B1 < A数组任意几个数之和 <B1+1
或许描述为:
B1 <= A数组某几个确定的数之和 <=B1+1
如果我理解的到位的话
这样的话的确很麻烦,不过如果知道是哪几个A数组中的数的话可以转化为线性规划问题……
[/Quote]

楼主可能写错了。如果是B1<A数组任意几个数之和<B1+1,那么A中全部都为0。如果是B1<=A数组任意几个数之和<=B1+1,那么A中最多只能有1个元素是1,其它全为0.
如果是“A数组某几个确定的数之和”这个条件的话,才有难度。
swimming8243 2009-08-28
  • 打赏
  • 举报
回复
的确,刚想起来

不等式前后是 <= 和 >=

其实我想,类似于有2的m次方个方程组(根据B数组的取值不同),只要任意一个有解即可,问题是如果m=1W或者10W估计大型机也计算不出来。

唯一可以考虑的是A数组的取值范围是0或者1,这个能不能造成一些取巧的高效算法呢??
swimming8243 2009-08-28
  • 打赏
  • 举报
回复
楼上的B,A是数组
showjim 2009-08-28
  • 打赏
  • 举报
回复
看不懂题:
if(B?==1)A=[1]|[1,1];
else 无解;
donkey301 2009-08-28
  • 打赏
  • 举报
回复
我觉得因为Ai前的系数是1所以可能性比较多,可以试着让它前面的系数变大点,而且保证不等式左右两侧的边界变换不是很大,这样可能性就会少很多,
譬如7<A1+A2+......+A10<8很难求,但如果有31<20A1+A2+A3+...+An<32,你就可以求出A1=1了。不过具体怎么变换我也没有多少想法,你可以试着做一下:
令B_l = (B1, B2, B3 ... Bm)', ' 表示转置
B_r = (B1+1, B2+1, B3+1 ... Bm+1)'
A = (A1, A2, A3, ... An)'
题目相当于求
B_l <= C * A <= B_r
C是m*n的一个系数矩阵,每个元素为0或者1。
a11, a12, ... a1n
C = (a21, a22, ... a2n)
...
am1, am2, ... amn
可以通过行之间的变换把它化为
d11, d12, ... d1n
( 0 , d22, .... d2n )
0, 0, d33,.. d3n
0, 0, .....0,dmm,... dmn
注意做变换时
B1-(B2+1) <= 第-行-第二行 <=B1+1-B2
这样看看能不能出现我说的哪种系数变大的情况。
绿色夹克衫 2009-08-28
  • 打赏
  • 举报
回复
感觉还是Dp和背包的问题!
在他乡奋斗 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 swimming8243 的回复:]
    B1 < A数组任意几个数之和 <B1+1
    B2 < A数组任意几个数之和 <B2+1
    .....
    Bm < A数组任意几个数之和 <Bm+1

A数组的每个值必然会出现在这一组不等式之间,只是出现的次数不定[/Quote]
不明白“A数组任意几个数之和”的意思。
A中的每一个数都会出现在所有不等式中,而且A中所有数之和也会出现在所有不等式中。只有0和1组成是数字很难满足这样的要求。
morilasi 2009-08-28
  • 打赏
  • 举报
回复
没太搞明白题。。
swimming8243 2009-08-28
  • 打赏
  • 举报
回复
多线程也不行,数据太多。
目前来看,只能用穷举法,但是耗时太长

有高手再帮我想想还有什么好的算法能解决这个问题?
PeacefulBY 2009-08-27
  • 打赏
  • 举报
回复
B1 < A数组任意几个数之和 <B1+1
或许描述为:
B1 <= A数组某几个确定的数之和 <=B1+1
如果我理解的到位的话
这样的话的确很麻烦,不过如果知道是哪几个A数组中的数的话可以转化为线性规划问题……
sunzerui 2009-08-27
  • 打赏
  • 举报
回复
顶贴啦!
okhysong 2009-08-27
  • 打赏
  • 举报
回复
存在满足不等式 B1 < A数组任意几个数之和 < B1+1 这样的整数吗?
B1(正整数)和B1+1之间存在一个整数吗?
难道少了个“=”号? 

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧