求一个算法

问题描述

客户有如此需求,不知道是懒,还是正常。感觉有难度。哈哈请大家帮忙分析一下。先谢谢。需求:财务部经常收到某客户几个合同的汇款,所以他们要人工去一个个找,可能正好等于,或某几个合同的款项。或最接近的某几个合同(有预付款的情况)比如某客户A共有6个合同A001123.4元A002200元A003300元A004350元A005450元A006500元情况一(某数相等)、客户汇款为:200元那么对应合同号:A002情况二(某几个数相加相等)、客户汇款为:423.4元那么对应合同号:A001、A003情况三(某个数或某几个数之和最接近)、找出最接近的参考合同。请大家帮忙分析一下。

解决方案

解决方案二:
帮忙顶,我想到的就是把所有情况列出来了,呵呵
解决方案三:
还是不明白你的需求。
解决方案四:
穷举法,一个一个试
解决方案五:
慢慢分析,这是基础
解决方案六:
引用1楼g_beginner的回复:

帮忙顶,我想到的就是把所有情况列出来了,呵呵

举个列子,可能不恰当。我借了你五次钱,分别是100、200、300、400、500(1)现在我还了你100结果:你拿出借条一看,是第一张(2)现在我还了你1500结果:你拿出借条一看,五次钱全还了(3)我还了你150结果:有可能是100、200(这两个数最接近还款)
解决方案七:
引用2楼hzzduoduo的回复:

还是不明白你的需求。

举个列子,可能不恰当。我借了你五次钱,分别是100、200、300、400、500(1)现在我还了你100结果:你拿出借条一看,是第一张(2)现在我还了你1500结果:你拿出借条一看,五次钱全还了(3)我还了你150结果:有可能是100、200(这两个数最接近还款)
解决方案八:
谢谢大家,帮帮忙啊
解决方案九:
要是只实现一个特例可以,全部实现有点不容易,不过可以分开来做
解决方案十:
可能误解了lz的原意.A:206B:{a:100b:150c:200d:300e:400f:600g:802}输入一个数A找出在指定数组里B中任意几个数值的和的下标.B排序;C取B中间的值:300下标:dA大于C往右进行折半查找,找到刚好等于的就输出下标比最后的值还大就.....组合查找,否则就取当前下标-1和当前下标+1小于一样;不知道是不是这样做o.
解决方案十一:
画个表列出来;就OK了;
解决方案十二:
我觉得,第一种情况循环比较下就行了,第二种情况声明2数组元素相加试试,第三种情况我也求解!!
解决方案十三:
情况一(某数相等)、客户汇款为:200元那么对应合同号:A002@lz:这个简单,直接查找情况二(某几个数相加相等)、客户汇款为:423.4元那么对应合同号:A001、A003情况三(某个数或某几个数之和最接近)、@lz:情况2与3实际上是一个问题,就是误差的设置而已:1.把数组从小到大排序2.找到与第一个数的和小于等于输入的元素下标end3.然后对从0到end取所有元素的组合求和4.找到和里面最接近的就可以了。因为这个组合的个数是不定的,所以必须要列举出所有的情况。但是因为求组合的性能问题,总共的个数每增加一个,计算都是爆炸式增加,所以对数据的组织要分类,查询的时候也要分类来查询。下面的代码是我使用的组合算法,作一点点修改就可以用了。packagetest;/***求N个元素的全排列算法:*1.创建一个大小为N个元素的数组.*2.利用N进制,满N加1的原则,对数组的第0个元素加1,满N了,则下一个元素值加1.*3.检查数组中的元素是否有重复的,如果没有,则是一个排列.*4.直到数组中的元素为0,1,2,...,N-1,则结束,否则继续第2步直到结束.*//***求N个元素中M个元素的组合算法:*1.创建一个大小为N个元素的数组,前M个元素为1,后面的N-M个元素为0*2.从左向右找到10的元素(前一个元素是1,下一个元素是0),交换这两个元素;*把此元素前面的所有1都移动到数组的最前面,此为一个组合,输出.*3.直到前N-M个元素都为0,则结束,否则继续第2步直到结束.*/publicclassCombinatory{publicstaticvoidproduceCombination(Stringstr,intsize){if(size>str.length()){thrownewIllegalArgumentException("Sizeistolarge.");}//创建一个数组,前size个元素全是1int[]digit=newint[str.length()];for(inti=0;i<size;++i){digit[i]=1;}//输出第一组printCombination(str,digit);while(!end(digit,digit.length-size)){for(inti=0;i<digit.length-1;++i){if(digit[i]==1&&digit[i+1]==0){//i上是1,i+1是0,交换inttemp=digit[i];digit[i]=digit[i+1];digit[i+1]=temp;//移动i前面的所有1到最左端intcount=countOf1(digit,i);for(intj=0;j<count;++j){digit[j]=1;}for(intj=count;j<i;++j){digit[j]=0;}printCombination(str,digit);break;}}}}//在下标end前1的个数privatestaticintcountOf1(int[]digit,intend){intcount=0;for(inti=0;i<end;++i){if(digit[i]==1){++count;}}returncount;}//数组中为1的下标对应的字符需要输出privatestaticvoidprintCombination(Stringstr,int[]digit){StringBuffersb=newStringBuffer();for(inti=0;i<digit.length;++i){if(digit[i]==1){sb.append(str.charAt(i));}}System.out.println(sb);}//结束条件:前size个元素都是0privatestaticbooleanend(int[]digit,intsize){intsum=0;for(inti=0;i<size;++i){sum+=digit[i];}returnsum==0?true:false;}publicstaticvoidmain(String[]args){System.out.println("Start");Stringstr="0123456789abcdef";longappStart=System.currentTimeMillis();longelapse=0;for(inti=1;i<=str.length();++i){longstart=System.currentTimeMillis();Combinatory.produceCombination(str,i);elapse=System.currentTimeMillis()-start;System.out.printf("Millis:%d,Seconds:%dn",elapse,elapse/1000);}elapse=System.currentTimeMillis()-appStart;System.out.printf("TotalMillis:%d,Seconds:%dn",elapse,elapse/1000);}}

解决方案十四:
这个问题是时间能够解决的问题,不解释
解决方案十五:
引用13楼linear56的回复:

这个问题是时间能够解决的问题,不解释

我在想一个问题:需求和实现是否是必须的?哈哈但是我作为程序员还是希望能给客户解决问题。
解决方案:
引用14楼koma_wind的回复:

引用13楼linear56的回复:这个问题是时间能够解决的问题,不解释我在想一个问题:需求和实现是否是必须的?哈哈但是我作为程序员还是希望能给客户解决问题。

给钱就有实现,不给钱,开什么玩笑,大家都很忙,*^o^*
解决方案:
这个有点麻烦至少复杂度是组合等级的

时间: 2024-10-21 08:46:32

求一个算法的相关文章

c语言-[C语言]求一个算法,输入N个数,输出所有其中任意M个数相加等于定值S的结果

问题描述 [C语言]求一个算法,输入N个数,输出所有其中任意M个数相加等于定值S的结果 如题,比如输入1,,2,10,5,7,8,9,11,输出其中任意几个数相加等于12的结果(不重复), 不自身相加. 1+2+9=12 10+2=12 7+5=12 解决方案 这题如果不考虑优化问题--轮询吧--总共有2的n次方种组合-学过排列组合的都知道

求一个算法如何用C#实现

问题描述 我想一个算法,根据取值的列数,将所有的组合项都事先填写到数据库中,比如取值只有1项标识取值11021取值中有2项标识取值1取值2100210301411取值有3项标识取值1取值2取值310002100301041105001610170118111如何用C#实现,请指教. 解决方案 解决方案二:比如取值只有1项标识取值11021取值中有2项标识取值1取值2100210301411完全没看懂,能详细的说下吗解决方案三:到底是什么规律解决方案四:有几位数值就有几个二进制位?解决方案五:对于

急急急!!!求一个算法

问题描述 编写数组复制方法.该方法从已知平衡的二维数组的左下角复制出一个非平衡的三角二维数组.设复制数组的方法模型为:publicstaticdouble[][]leftDownConer(double[][]anArray) 解决方案 解决方案二:这个在java核心技术里有讲.解决方案三:不难吧解决方案四:引用1楼boyone2009的回复: 这个在java核心技术里有讲. 能不能给个详细的算法?谢谢了!

求一个算法。。路过的进来看看~~~~

问题描述 比如:1,2,3,4,5五个数(有可能多有可能少),如果我传入一个2就说明我要分成2个部分,结果是:12,34513,24514,23515,23423,14524,13525,13434,12535,12445,123-----------如果我出入一个3就说明要分成3组结果如:--------12,34,513,24,514,23,515,23,4......---------------------请兄弟姐妹们写写算法呵呵谢谢了~~~ 解决方案 解决方案二:有意思!解决方案三:哦

ASP.NET 求一个算法.

问题描述 name:张三age:20gender:男name:李四age:23gender:女job:工程师name:王五birthDate:2012-01-01以上数据输入TextBox中.nameagegenderbirthDate...为数据库中字段(字段不固定,如果有输入的字段不存在,会自动创建.)求算法.二维数组定义时无法确定长度.请高人指点. 解决方案 解决方案二:这有什么算法?还是我没听懂?解决方案三:你先用空格分隔然后用:分隔左边为字段名右边为值解决方案四:用集合最简单的List

求一个算法。。。5个1-10 不能重复的算法

问题描述 5个1-10,每个里面只选一个数,不能重复数字,有多少种组合....第一行1-10选择1第二行1-10选择2第三行1-10选择3第四行1-10选择4第五行1-10选择5 解决方案 解决方案二:这不是排列组合吗?10*9*8*7*6*5种组合解决方案三:对,排列组合问题,无放回取样解决方案四:有顺序,是10*9*8*7*6种组合.没顺序,是10*9*8*7*6/(1*2*3*4*5)种组合.解决方案五:广度优先算法,使用队列,直接扩展5层之后,队列集合就是结果集.解决方案六:上面说的是1

50分,在线求一个算法问题,有两个数组A,B,判断A中是否至少有一个元素和B中元素相同(即判断两个数组的元素是否有交集)

问题描述 最笨的办法当然是二层嵌套循环,但觉得应该有更好的方法,但是着实想不出来,想听听大家的意见,大家帮帮小弟i.estring[]A={"X","Y","Z","W"};string[]B={"X","E","Z","U","V"};只要发现B中有一个A的元素就可以 解决方案 解决方案二:循环应该比较简单如果实在数据量大,可

求一个抽奖算法,最好java实现

问题描述 求一个抽奖算法,最好java实现 需求如下: 总共分四等奖, 1等奖名额2个,中奖概率2/10000 2等奖名额10个,中奖概率5/1000 3等奖名额100个,中奖概率10/100 4等奖名额880个,中奖概率25/100 求一个算法,算出用户单次抽奖中奖等级(1,2,3,3等奖或不中奖). 最好java实现. 解决方案 说个最简单的,用java的随机函数.用Random类生成随机数,也可以用Math类中的random生成 区别看这里:http://liukai.iteye.com/

一个算法题,求答案啊啊啊啊

问题描述 一个算法题,求答案啊啊啊啊 白班 09:00-18:00 通班 09:00-21:00 每个人每个月通班数量必须等于早中班和中晚班数量之和 早中班 09:00-15:00 中晚班 15:00-21:00 假设:每月按照30计算. 排班规则: 1.每个人每个月固定休息6天连续上班天数不超过7天. 2.每天各班次上班的人数最低需求:8个白班5个通班1个早中班,2个中晚班. 3.每个月每个人的通班天数安排不超过8天. 4.每个人每个月早中班和中晚班的天数之和需要与通班天数相等. 5.每月最多