日期:2014-05-17  浏览次数:20949 次

几天没休息好,头昏脑胀,求个算法
几天没休息好,头昏脑胀,求个算法

已知:
一个大数V,很大
数字A
数字B
数字C
数字D
数字...
A、B、C、D、...这些数字远小于V,而且他们的和(A+B+C+D+...)也远小于V
求满足如下条件:
A1*x1+B1*x2+C1*x3+D1*x4+...=V

A1<=A
B1<=B
C1<=C
D1<=D
并且x1>x2>x3>x4


的所有
A1-x1
B1-x2
C1-x3
D1-x4
的组合
--------------------------------------------
例如
V=654321
A=54
B=257
C=19
D=360

求满足如下条件
A1*x1+B1*x2+C1*x3+D1*x4=V
A1<=A
B1<=B
C1<=C
D1<=D
并且x1>x2>x3>x4
的所有
A1-x1
B1-x2
C1-x3
D1-x4
的组合
算法

------解决方案--------------------


看到算法头疼
------解决方案--------------------
我数学老师被程序员给绑架了 所以帮不上你 但是帮顶!!
------解决方案--------------------

------解决方案--------------------

看了一会,感觉可以帮你的只有顶一下了...
------解决方案--------------------
單單這些條件還不夠吧,數字的正負或者數字為整型還是浮點型都沒有明確說明。
------解决方案--------------------
我表示看的头疼。。。。
------解决方案--------------------
真不好搞,全都是未知的数,而且还要是4个数才是一个组合一个解,真有这样的算法吗?
Mark下先

------解决方案--------------------
坐 等 大 牛
------解决方案--------------------
可能性太多了,即使只考虑A1=A,B1=B,C1=C,D1=D这一种情况,在x1>x2>x3>x4,且x4>0的情况下,程序已算到7万中组合了, 目前54*9983+257*333+19*1542+360*1
可以看出x4还停留在1,这样看来,组合起码1千万种

------解决方案--------------------
引用:
Quote: 引用:

單單這些條件還不夠吧,數字的正負或者數字為整型還是浮點型都沒有明確說明。

不好意思,所有数字都是正整数,可以是0。
A、B 、C、 D……这些数字至少有3个

條件還是不全。這樣導致結果很多,而且值不確定。
假設一結果是這樣:D為1,A、B、C都為0符合條件。那么x4=V,但是X1,X2,X3值就不確定。
樓主給出的條件不全,這樣即使有人想幫忙,也做不出來啊。
------解决方案--------------------
如果再考虑A1<=A,B1<=B,C1<=C,D1<=D,
为了便于计算。
A1取值范围是 1-54
B1取值范围是 1-257
C1取值范围是 1-19
D1取值范围是 1-360
这样排列组合有54*257*19*360种,每种组合都有1千万种排列,这样看计算机都要算很久的。
------解决方案--------------------
V越大,ABC个数越多,ABC数值越小,组合就越多。
只考虑A1=A,B1=B,C1=C,D1=D,即54*x1+257*x2+19*x3+360*x4=654321,限定条件
x1>x2>x3>x4,且x4>0的情况下,
用递归算了一下,组合有40375394种。用时64秒左右(把打印部分注释掉了),这个应该没有什么算法,只能递归吧?

        private static int iGroupCnt = 0;
        private static int[] arrSum;
        private static int[] arrFloorSum;

        static void Main(string[] args)
        {
            Stopwatch sw =&n