高分问一个算法问题,请帮忙,谢谢! 比如要开20W元发票,但目前只有千元发票,现要求开的900以上的发票张数占60%,800-899发票张数占20%,700-799发票张数占10%,600-699发票张数占5%,500-599发票张数占2%,400-499发票张数占1%,300-399发票张数占1%,200-299发票张数占1%。要生成这类发票,算法如何写?发票面额如900以上 800-899等都是随机生成,在范围之内,不能用固定的800或900等。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1、确定发票数,可以从界面录入(例如100X)2、从小值到大值取随机数200-299一X,300-399一X,400-499一X, 500-599两X600-699五个,700-799十X,800-899二十X3、Y = 算出剩余钱数/60X,M = 900 + 2*(Y-900)4、900到M取30个随机数,小于Y的就再取一个对应大于Y的值(如Y=1000,M=1100)其中一随机数999小于Y,则再去对称值1001,这样30X对刚好 xiaoxiao197821(你的笑对我很重要) 发票数也是由系统自动确定的,不能手工输入的 yangmanyuan(蓝天白云) 是说我吗? littlefishli(凉水塞牙~) 确实 这个百分比是可以有一点误差的 但也是有一定条件才可以的,如果发票总共只开3000还是5000的 是不可能有这个百分比例的 设发票数为X以每类发票的最大额-50元或40元为上限,根据百分比计算每类发票的张数,余额随机分配到每类发票中OKOKOKOKOKOKOK !! 我用在公司空闲的时间大概想了一个算法。有点仓卒,可能算法会有问题。如果想进一步考虑在qq上和我联系吧14250050ok,下面是算法:前提:能够完成生成某一段的随机数(例如,900-990,800-899等)而且这些数都是整数。思想:按照现有发票张数的比例动态分配下一张发票应该在的区间。分配的方法是按照发票的权重来分配发票的优先权。流程如下:循环判断:总额不超过规定总额。循环体:用一个数组记录每一个段的发票的数量,另一个字段记录每一张发票的面额,首先由第一个数组判断最高权重的发票段(900-990段)的张数在总发票数里占的比例是否达到了规定比例,达到了就计算下一个段的发票组的比例。如果当前段的发票张数没有达到规定的比例,那么就分配下一张发票在此发票段,随机生成一张发票,记录进发票的数组,然后当前段的发票数+1,结束当前循环。如果到最后一个段都达到规定的比例(这个情况每100次循环发生一次)那么下一张发票就分配在权重最重的发票段。如此平衡又被打破,循环继续。直到总额超过规定总额。结束循环的处理:最后一张发票取消,剩下的缺口金额是在1-990之间,这个就判断处理一下就ok了,200-990的话就直接分配最后一张了,如果是1-199的话,就把600-699的最后一张发票取出来加上这个差额就行了。这样分配少于1000张发票可能产生的张数上的误差都会比较大,但是1000张以上应该问题就不大了,毕竟张数与规定比例的张数最多就差2张,就算最少的1%的200-299段的发票,这种情况下也有10张以上,这么2张的误差应该可以接受了。如果有具体要求再商量。不才只能想到这么多了。有问题达人给斧正。 littlefishli(凉水塞牙~) 我现在的想法和这个有点出入 我的想法是 如果总额够开100张以上 就100张100张的开 不足100张是 用你的这个方法 littlefishli(凉水塞牙~) 只要总金额大于91260 就可开100张呀 ctrl+F弹出查询窗口调用问题 Grid指定列行数 设置打开单元路径 如何让两个窗口同时使用? 如何在QuickReport中的TQRDBText自动换行(很急的) 请问各位大虾,BDE怎么调用ACCESE建的库 线上等 怎么把一个正方形分成面积相等的7块。 哪位了解超市的? 一个会用MapInfo或MapX和Delphi结合进行开发的人的月薪 delphi 好用吗? 想覆盖原来的文件除了用rewrite外,用FileCreate可以吗 200分求 如何在1个目录中搜索多个文件!还有100分在Delphi VCL组件开发及应用中,在线等
2、从小值到大值取随机数200-299一X,300-399一X,400-499一X, 500-599两X
600-699五个,700-799十X,800-899二十X
3、Y = 算出剩余钱数/60X,M = 900 + 2*(Y-900)
4、900到M取30个随机数,小于Y的就再取一个对应大于Y的值
(如Y=1000,M=1100)其中一随机数999小于Y,则再去对称值1001,这样30X对刚好
发票数也是由系统自动确定的,不能手工输入的
是说我吗?
确实 这个百分比是可以有一点误差的 但也是有一定条件才可以的,如果发票总共只开3000还是5000的 是不可能有这个百分比例的
以每类发票的最大额-50元或40元为上限,根据百分比计算每类发票的张数,余额随机分配到每类发票中
OKOKOKOKOKOKOK !!
ok,下面是算法:
前提:能够完成生成某一段的随机数(例如,900-990,800-899等)而且这些数都是整数。
思想:按照现有发票张数的比例动态分配下一张发票应该在的区间。分配的方法是按照发票的权重来分配发票的优先权。
流程如下:循环判断:总额不超过规定总额。循环体:用一个数组记录每一个段的发票的数量,另一个字段记录每一张发票的面额,首先由第一个数组判断最高权重的发票段(900-990段)的张数在总发票数里占的比例是否达到了规定比例,达到了就计算下一个段的发票组的比例。如果当前段的发票张数没有达到规定的比例,那么就分配下一张发票在此发票段,随机生成一张发票,记录进发票的数组,然后当前段的发票数+1,结束当前循环。如果到最后一个段都达到规定的比例(这个情况每100次循环发生一次)那么下一张发票就分配在权重最重的发票段。如此平衡又被打破,循环继续。直到总额超过规定总额。
结束循环的处理:最后一张发票取消,剩下的缺口金额是在1-990之间,这个就判断处理一下就ok了,200-990的话就直接分配最后一张了,如果是1-199的话,就把600-699的最后一张发票取出来加上这个差额就行了。
这样分配少于1000张发票可能产生的张数上的误差都会比较大,但是1000张以上应该问题就不大了,毕竟张数与规定比例的张数最多就差2张,就算最少的1%的200-299段的发票,这种情况下也有10张以上,这么2张的误差应该可以接受了。如果有具体要求再商量。
不才只能想到这么多了。有问题达人给斧正。
我现在的想法和这个有点出入 我的想法是 如果总额够开100张以上 就100张100张的开 不足100张是 用你的这个方法
只要总金额大于91260 就可开100张呀