请教一个关于算法的问题

xieshy 2006-04-25 10:48:13
一个客户按时间先后的挂帐记录如下:
100 --(1)
-60 --(2)
10 --(3)
-20 --(4)
10 --(5)
200 --(6)

总额为240. 现在客户要按时间先后(部分地)销帐,交40元. 现在要求销掉(1)至(5)笔记录,剩第(6)笔未销. 而不是只销掉第(1)笔40元,或只销掉第(1)笔和第(2)笔而已.

这应该属于"贪婪算法"吧?

本人的想法是:从最后一笔即第(6)笔开始向前推算,只要数额总和等于40,就全部将其销掉. 但海量数据时这一算法应该很慢.

现在寻求一种快速的,高效的,能实现上述要求的算法.
...全文
199 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yurow 2006-04-28
  • 打赏
  • 举报
回复
尽可能多得加减数据使数据符合当前需要销帐的数目
前5比的总和为40,要销帐的数目也为40

我觉得可以先把相同的正负数(和总为0)的全部销帐,

然后再设计算法时候,首先算出所有负数的总和(你放的数据应该在数据库,用查询很容易实现,正数的总和应该总大于负数的总和?),

然后在正数中选择性得加数据以使正数的和尽可能的和负数的总和相等,


如果不等,当正数大于负数时候,减去负数中一个较大的,减去正数中一个较小的(不一定会发生,比如-600,610,可以减去负数中如果有-10的数)

``````

很复杂啊
xiao_d 2006-04-28
  • 打赏
  • 举报
回复
无论你是什么帐目,你去问会计怎么做,参考他的业务流程就可以了!本质上,你做的就是一个流水帐,所以按帐目表的计算方式是最方便的,而不是最后统一算!
Knight94 2006-04-25
  • 打赏
  • 举报
回复
鉴于账目条目是按时间来排的,即顺序的,因此只有正向推算,以及反向推算两种方法。
但是对比来说还是反向推算要高效些,即你所实现的方法就是。
葫芦鬼 2006-04-25
  • 打赏
  • 举报
回复
没看懂 昏厥中。。。
zhongkeruanjian 2006-04-25
  • 打赏
  • 举报
回复
现在客户要按时间先后(部分地)销帐,交40元. 现在要求销掉(1)至(5)笔记录,剩第(6)笔未销. 而不是只销掉第(1)笔40元,或只销掉第(1)笔和第(2)笔而已


上面的话实在是太深奥了。。。。
SeeSunSet 2006-04-25
  • 打赏
  • 举报
回复
要处理的应该是一个客户的吧?一个客户一段时间的帐怎么可能会有海量数据啊?
shrinerain 2006-04-25
  • 打赏
  • 举报
回复
你的方法是正确的,先计算总和,然后从后向前开始做减法。
直到和等于给定值为止。
Ivony 2006-04-25
  • 打赏
  • 举报
回复
同意挑刺的说法,在帐里面应该保存余额,要不数据多了计算余额想死……
tiaoci 2006-04-25
  • 打赏
  • 举报
回复
当然对于那些SQL大师,完全可以把上面两个SQL合并成一个
tiaoci 2006-04-25
  • 打赏
  • 举报
回复
我觉得要快,那么每次输入记录时要把余额也保存起来

这样最后销账时,

找出 时间最大,但是 余额 小于 给定金额的记录的流水号(SQL 查询)

然后把前面所有的记录都结清[流水号小于等于上面查到的记录](SQL 更新)

一共两个操作/SQL,应当足够快了吧?



xieshy 2006-04-25
  • 打赏
  • 举报
回复
这是一个以结帐方式购物的记帐记录.正数为购买,负数为退货,合计为总帐数目.

大家的想象力这么丰富...
xiao_d 2006-04-25
  • 打赏
  • 举报
回复
100 --(1)
-60 --(2)
10 --(3)
-20 --(4)
10 --(5)
200 --(6)

正数应该是充值负数是消费吧?这样每发生一笔费用就应该消一次帐啊,怎么可能等到发生某一次充值的时候才消帐?
余额
(1)100 100
(2)-60 40
(3)10 50
(4)-20 30
(5)10 40
(6)200 240
(7)40 280

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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