C#.NET 关于金额多对一或一对多匹配的算法

问题描述

例:1、数据库有N条用户需求,张二10000元,张三8000元,张四5000元,李三8000元.....需求的人无限...2、数据库提供的供应者也是N条,王二提供5000元,王三提供8000元,王四提供7000元,王五提供1000元,王六提供10000元....无限匹配1个或多个供应者。如有单个供应者正好提供10000元,就匹配单个供应者。如没有就匹配:9000+1000,或8000+2000,或7000+2000+1000。。。。匹配成功的放入相应数据表。求最优算法。谢谢!

解决方案

本帖最后由 aite520 于 2015-11-02 15:44:45 编辑
解决方案二:
如下算法的复杂度为O(N*Log(N))。代码没有注释,楼主/有兴趣的朋友,或请加注释。publicstaticList<int>CombineTo(inttotal,List<int>items){if(items.Any(i=>i<=0))thrownewInvalidOperationException("onlypositivenumbersallowed.");items.Sort();//O(n*Log(n))List<int>result=newList<int>();if(CombineTo(total,items,0,items.Count,result)!=total){result.Clear();}returnresult;}privatestaticintCombineTo(inttotal,List<int>sortedItems,intoffset,intlength,List<int>result){inti=sortedItems.BinarySearch(offset,length,total,Comparer<int>.Default);//O(Log(n))if(i>=0){result.Add(sortedItems[i]);returntotal;}i=(~i)-1;for(intj=i;j>0;j--){intsubTotal=total-sortedItems[j];intachieved=CombineTo(subTotal,sortedItems,0,j,result);if(achieved==subTotal){result.Add(sortedItems[i]);returntotal;}if(achieved<subTotal)break;//凑不齐的情况下,CombineTo最多调用n次。}return0;}publicstaticvoidTest(){List<int>items=newList<int>(){2,8,1,5};varr0=CombineTo(0,items);//{}varr1=CombineTo(1,items);//{1}varr2=CombineTo(2,items);//{2}varr3=CombineTo(3,items);//{1,2}varr4=CombineTo(4,items);//{}varr5=CombineTo(5,items);//{5}varr6=CombineTo(6,items);//{1,5}varr7=CombineTo(7,items);//{2,5}varr8=CombineTo(8,items);//{8}varr9=CombineTo(9,items);//{1,8}varr10=CombineTo(10,items);//{2,8}varr11=CombineTo(11,items);//{1,2,8}varr12=CombineTo(12,items);//{}varr13=CombineTo(13,items);//{5,8}varr14=CombineTo(14,items);//{1,5,8}varr15=CombineTo(15,items);//{2,5,8}varr16=CombineTo(16,items);//{1,2,5,8}varr17=CombineTo(17,items);//{}}

解决方案三:
补充一下问题。还有个情况就是供应者可以拆分自己提供的金额和需求者匹配比如:1、需求者:张三1000元,张四1000元2、供应者:王三提供2000元系统可以把王三拆分为两个1000,分别和张三、张四匹配
解决方案四:
你这个是哪里的试题么?
解决方案五:
都可以拆了,还有什么是不可以的?

时间: 2024-08-22 14:59:02

C#.NET 关于金额多对一或一对多匹配的算法的相关文章

hibernate-eclipse如何利用数据库反向生成Hibernate多对多、一对多实体类(生成全部为int类型)。

问题描述 eclipse如何利用数据库反向生成Hibernate多对多.一对多实体类(生成全部为int类型). 如题 解决方案 如果你表的关系建好了,,直接通过dataSource就能反向生成了 解决方案二: Myeclipse 连接到你的数据库,在对应的表上右击,点hibernate reserve ,然后一步步操作下去,就会成功 解决方案三: /* SQLyog Ultimate v10.00 Beta1 MySQL - 5.6.26-log : Database - db_template

第十章 基于Annotation的关系映射 多对一与一对多

如果下面部分内容有不明白的可以查找: 基于Annotation的关系映射 前期准备:http://blog.csdn.net/p_3er/article/details/9061911 基于xml的多对一:http://blog.csdn.net/p_3er/article/details/9036759 基于xml的一对多:http://blog.csdn.net/p_3er/article/details/9036921 本文是把多对一与一对多结合起来了,形成一个双向的映射.如果只想要单向的

hibernate 同一个类中多对一,一对多,不会用,请指教,讲解一下,最好是告诉我如何遍历

问题描述 <p>hibernate 同一个类中多对一,一对多,不会用,请指教,讲解一下,最好是告诉我如何遍历userlist = userService.searchAll();这个结果集的容器的内容,用System.out.println(userlist);输出的是[com.test.bean.User@1ee5806, com.test.bean.User@708d23, com.test.bean.User@12bc86d, com.test.bean.User@1738d88, co

sql server-SQLServer一对多匹配问题

问题描述 SQLServer一对多匹配问题 大神们好,小弟请教一个问题: Create Table #T1(Id int, Name varchar(20), DeptId varchar(20)) Insert into #T1(Id, Name, DeptId) select Id=1, Name = '张三', DeptId = '001.001.001' union select Id=2, Name = '李四', DeptId = '001.001.002' union select

【hibernate框架】关于多对一与一对多关系的剖析

关于一对多,举个例子,一个用户组可以包含多个用户,每个用户只能属于一个用户组.一个人可以有多辆车,每辆车只能属于一个人.这些都是一对多的关系. 打个比方,一个人可以有多辆车,每辆车只能属于一个人. 两张表,一张表Person,一张表Car.关键是他们两个之间在数据库表中怎么设计关联呢? Person id<int> name<vechar>;  Car id<int> color<vachar>; 错误做法: 1.在一方加冗余 Person id<in

Hibernate(6)—— 一对多 和 多对多关联关系映射(xml和注解)总结

俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!涉及的知识点总结如下: One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotation) Many to Many 映射关系 多对多单向外键关联(XML/Annotation) 多对多双向外键关联(XML/Annotation) set的inverse元素详解 问题小结 关联关系的优缺点 多

Hibernate关联关系配置(一对多、一对一和多对多)

第一种关联关系:一对多(多对一) "一对多"是最普遍的映射关系,简单来讲就如消费者与订单的关系. 一对多:从消费者角的度来说一个消费者可以有多个订单,即为一对多. 多对一:从订单的角度来说多个订单可以对应一个消费者,即为多对一.   一对多关系在hbm文件中的配置信息: 消费者(一方): <?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLI

[NHibernate]一对多关系(级联删除,级联添加)

目录 写在前面 文档与系列文章 一对多关系 一个例子 级联删除 级联保存 总结 写在前面 在前面的文章中,我们只使用了一个Customer类进行举例,而在客户.订单.产品中它们的关系,咱们并没有涉及,比如一个客户可以有一个或者多个订单,在数据库中变现为"主外键关系",有时也喜欢称为"父子关系".那么就让我们一起学习,在nhibernate中,是如何处理这种关系的吧? 文档与系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFacto

Hibernate学习(五)一对多单向关联映射

在上一篇博客<一口一口吃掉Hibernate(四)--多对一单向关联映射>中,介绍了多对一的关联映射,今天就反过来说一下一对多的单向关联映射. 可能有人会对这2篇博客的题目有点混淆不清,跟日常说的关系有点不同.我们日常说的比如父子关系,夫妻关系都是说的双向关系,而现在讨论的则是单向关系,所以也就有了多对一和一对多的说法. 二者的关系其实很简单,只是角度不同而已.比如说学生和班级的关系.如果从学生角度来看,是多对一的关系.而从班级角度来看,则是一对多的关系.说法很简单,但是在对象和关系的建立却是