| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 902 人关注过本帖
标题:[求助]有关找差额的算法求助
只看楼主 加入收藏
whinda
Rank: 6Rank: 6
等 级:贵宾
威 望:13
帖 子:253
专家分:418
注 册:2012-2-4
结帖率:66.67%
收藏
已结贴  问题点数:100 回复次数:16 
[求助]有关找差额的算法求助
自然数集合C中有N个数,求C中数之和等于给定数S的组合的个数(组合不定长)。

现实运用:
如有100笔销售往来(含退货,即负数),现对帐发现少了1500元,求这少的1500是由哪几笔组成的。

大致思路如下:
将100笔金额以升序排序,从小加到大,如加到第X笔数额大于1500时,可知1500最多由X-1笔数额组成,最少为1笔。
尝试用叠代递归函数加总额判断的方式来做,算法想了三天,无果。现苦逼中,请大神给个范例,要有效率的算法哈,如果总笔数超1000,单个组合判断有点浪费电,1000*1000*变动组合长度????

谢谢大神!
搜索更多相关主题的帖子: 自然数 
2015-04-10 02:23
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10608
专家分:43190
注 册:2014-5-20
收藏
得分:0 
很实际的问题,尤其是往来单位结算对账。
2015-04-10 07:51
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
1、差额的记录不一定是有规律的,按楼主的算法99%是不能实现的。
2、如果某笔销售是1500元,录入时误为1600元,这100元的差异靠你用任何算法都是无法算出来的。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2015-04-10 07:53
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
我觉得楼上的说法有一定道理。我不是搞财务的,仅提出个人观点,如有错误不要拍砖:对于账目不平衡的核查,我觉得最靠谱的办法就是查单据。假设在录入没有错误,且所有操作也规范的情况下,单据应该能稳准狠地找出问题所在。
2015-04-10 08:00
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10608
专家分:43190
注 册:2014-5-20
收藏
得分:0 
思路对的,答案可能不只一个。
程序运行效率就看如何优化。
2015-04-10 08:02
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10608
专家分:43190
注 册:2014-5-20
收藏
得分:0 
楼主的问题应该是在保证“账证相符”下进行的往来款项对账,月末结账都要保证“账账相符、账证相符”吧。
2015-04-10 08:15
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9844
专家分:27213
注 册:2012-2-5
收藏
得分:0 
同意3楼、4楼的看法。楼主的思路与凑数的思路差不多,误操作可能是导致数据不准确的主要原因,如右侧小键盘的147、258、369、123、456、789,按错任何一个键,都会造成数据的录入错误。最快捷而有效的方法是核对凭证数据与录入数据是否一致,才是找到错误发生的主要方法。
记得每张凭证制作完成后,在凭证的下方都有一个合计数,那么录入的数据也应该有一个对应的合计数,应该从这方面查找,如果两者不一致,录入错误的数据不就查到了吗。按凭证号分组合计,应该是最快的方法。

坚守VFP最后的阵地
2015-04-10 08:32
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
以下是引用taifu945在2015-4-10 08:00:39的发言:

我觉得楼上的说法有一定道理。我不是搞财务的,仅提出个人观点,如有错误不要拍砖:对于账目不平衡的核查,我觉得最靠谱的办法就是查单据。假设在录入没有错误,且所有操作也规范的情况下,单据应该能稳准狠地找出问题所在。
思路很正确,从单据入手才是有效的,省时也省力
2015-04-10 09:11
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10608
专家分:43190
注 册:2014-5-20
收藏
得分:100 
按照楼主思路试试,是不是这个意思:
从m个数中取出n个数的和等于k的组合
程序代码:
CREATE CURSOR dd (cc C(254))
m = 10
k = 80
DIMENSION aa[m]
FOR i = 1 TO m
    aa[i] = i*10
ENDFOR
_f(@aa, k)
GO TOP 
BROWSE
RETURN

FUNCTION _f(aa, k)
    LOCAL i
    FOR i = 1 TO ALEN(aa)
        IF aa[i] > k
            EXIT
        ENDIF
    ENDFOR
    DIMENSION aa[i-1]
    FOR i = 1 TO ALEN(aa)
        LOCAL bb[i]
        _ff(@aa, @bb, i, 1, 1, k)
    ENDFOR
ENDFUNC

FUNCTION _ff(aa, bb, n, ai, bi, k)
    LOCAL i, dd, ss
    IF (n == 0)
        dd = bb[1]
        ss = TRANSFORM(bb[1])
        FOR i = 2 TO bi-1
            dd = dd + bb[i]
            ss = ss + "," + TRANSFORM(bb[i])
        ENDFOR
        IF dd == k
            INSERT INTO dd VALUES (ss)
        ENDIF
        RETURN
    ENDIF
    FOR i = ai TO ALEN(aa)
        bb[bi] = aa[i]
        _ff(@aa, @bb, n-1, i+1, bi+1, k)
    ENDFOR
ENDFUNC


[ 本帖最后由 吹水佬 于 2015-4-10 09:52 编辑 ]
2015-04-10 09:51
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10608
专家分:43190
注 册:2014-5-20
收藏
得分:0 
这是个常见问题,有时几个月才结算一次,供货商业务人员经常来核对货款,往往不清楚收到的货款是属于哪几张发票,就来找付款方的付款凭证核对每张发票,做法有点麻烦,有时甚至要查到几年前的凭证。
2015-04-10 10:35
快速回复:[求助]有关找差额的算法求助
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019775 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved