数据匹配问题算法问题

helodd 2020-12-17 11:15:26
10行记录
id 数量
001 5
002 8
003 20
004 35
005 41
006 2
007 15
008 10
009 9

如何取出 10 行记得中的任意行,数量合计 为 50 ?方法不限。
...全文
346 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
雨夹雪 2021-01-11
  • 打赏
  • 举报
回复
top 1 咯
匚匚.. 2021-01-09
  • 打赏
  • 举报
回复
引用 5 楼 雨夹雪 的回复:

--数据库搞这个的确有点郁闷
--建表
CREATE TABLE #T
(
	id VARCHAR(10) ,
	数量 INT
)

--测试数据 
INSERT INTO #T VALUES('001',    5)
INSERT INTO #T VALUES('002',    8)
INSERT INTO #T VALUES('003',    20)
INSERT INTO #T VALUES('004',    35)
INSERT INTO #T VALUES('005',    41)
INSERT INTO #T VALUES('006',     2)
INSERT INTO #T VALUES('007',    15)
INSERT INTO #T VALUES('008',    10)
INSERT INTO #T VALUES('009',    9)
 

--方法一,找出所有解
;
WITH ct
AS
(
	SELECT * ,数量 AS 合计,CONVERT(VARCHAR(max),id) AS 结果 FROM #T WHERE 数量<=50 
	UNION ALL 
	SELECT b.*,B.数量+a.合计,结果+','+b.id  FROM ct a INNER JOIN #T b ON b.id >= a.id AND a.合计+b.数量<=50  AND CHARINDEX(b.id,结果)=0 
 )
 SELECT 结果 FROM ct  WHERE 合计=50
 
 

--方法二,找出第一次满足结果的解 
SELECT *, 数量 AS 合计,CONVERT(VARCHAR(max),id) AS 结果 INTO #rst FROM #T WHERE 数量<=50 
WHILE NOT EXISTS(SELECT 1 FROM #rst WHERE 合计=50)
BEGIN 
	INSERT INTO #rst(id,数量,合计,结果)
	SELECT b.id,b.数量,B.数量+a.合计,结果+','+b.id
	FROM #rst a INNER JOIN #T b ON b.id >= a.id AND  a.合计+b.数量<=50  AND CHARINDEX(b.id,结果)=0 
END 

SELECT 结果 FROM #rst WHERE 合计=50
DROP TABLE #rst 


大佬,这个返回的值是多个啊?如果数据只能有一条的组合怎么操作?
雨夹雪 2020-12-18
  • 打赏
  • 举报
回复

--数据库搞这个的确有点郁闷
--建表
CREATE TABLE #T
(
	id VARCHAR(10) ,
	数量 INT
)

--测试数据 
INSERT INTO #T VALUES('001',    5)
INSERT INTO #T VALUES('002',    8)
INSERT INTO #T VALUES('003',    20)
INSERT INTO #T VALUES('004',    35)
INSERT INTO #T VALUES('005',    41)
INSERT INTO #T VALUES('006',     2)
INSERT INTO #T VALUES('007',    15)
INSERT INTO #T VALUES('008',    10)
INSERT INTO #T VALUES('009',    9)
 

--方法一,找出所有解
;
WITH ct
AS
(
	SELECT * ,数量 AS 合计,CONVERT(VARCHAR(max),id) AS 结果 FROM #T WHERE 数量<=50 
	UNION ALL 
	SELECT b.*,B.数量+a.合计,结果+','+b.id  FROM ct a INNER JOIN #T b ON b.id >= a.id AND a.合计+b.数量<=50  AND CHARINDEX(b.id,结果)=0 
 )
 SELECT 结果 FROM ct  WHERE 合计=50
 
 

--方法二,找出第一次满足结果的解 
SELECT *, 数量 AS 合计,CONVERT(VARCHAR(max),id) AS 结果 INTO #rst FROM #T WHERE 数量<=50 
WHILE NOT EXISTS(SELECT 1 FROM #rst WHERE 合计=50)
BEGIN 
	INSERT INTO #rst(id,数量,合计,结果)
	SELECT b.id,b.数量,B.数量+a.合计,结果+','+b.id
	FROM #rst a INNER JOIN #T b ON b.id >= a.id AND  a.合计+b.数量<=50  AND CHARINDEX(b.id,结果)=0 
END 

SELECT 结果 FROM #rst WHERE 合计=50
DROP TABLE #rst 


疯狂的疯 2020-12-17
  • 打赏
  • 举报
回复


if OBJECT_ID('tempdb..#A') is not null
begin
	drop table #A
end
 
select v,ROW_NUMBER()over(order by v) id into #A from(
	select 1 id,5 v union all
	select 2 ,8  union all
	select 3 ,20  union all
	select 4 ,35  union all
	select 5 ,41  union all
	select 6 ,2  union all
	select 7 ,15  union all
	select 8 ,10  union all
	select 9 ,9  
)t;

  --六个数字组合
  with cte as(
  select t1.id t1_id,t1.v t1_v,
  t2.id t2_id,t2.v t2_v,
  t3.id t3_id,t3.v t3_v,
  t4.id t4_id,t4.v t4_v,
  t5.id t5_id,t5.v t5_v,
  t6.id t6_id,t6.v t6_v,
  ROW_NUMBER()over(order by t1.id) Ord
  
  from #A t1
 left join #A t2 on t1.id<t2.id
 left join #A t3 on t2.id<t3.id
 left join #A t4 on t3.id<t4.id
 left join #A t5 on t4.id<t5.id
 left join #A t6 on t5.id<t6.id
 ),c as(
 select *,
		SUM(isnull(cte.t1_v,0) + isnull(cte.t2_v,0)) over(partition by Ord) Sum_2,
		SUM(isnull(cte.t1_v,0) + isnull(cte.t2_v,0) + isnull(cte.t3_v,0)) over(partition by Ord) Sum_3,
		SUM(isnull(cte.t1_v,0) + isnull(cte.t2_v,0) + isnull(cte.t3_v,0) + isnull(cte.t4_v,0)) over(partition by Ord) Sum_4,
		SUM(isnull(cte.t1_v,0) + isnull(cte.t2_v,0) + isnull(cte.t3_v,0) + isnull(cte.t4_v,0) + isnull(cte.t5_v,0)) over(partition by Ord) Sum_5,
		SUM(isnull(cte.t1_v,0) + isnull(cte.t2_v,0) + isnull(cte.t3_v,0) + isnull(cte.t4_v,0) + isnull(cte.t5_v,0) + isnull(cte.t6_v,0)) over(partition by Ord) Sum_6

 from cte
 )

  select distinct c.t1_v,
		case when c.Sum_2<=50 then c.t2_v else 0 end t2_v,
		case when c.Sum_3<=50 then c.t3_v else 0 end t3_v,
		case when c.Sum_4<=50 then c.t4_v else 0 end t4_v,
		case when c.Sum_5<=50 then c.t5_v else 0 end t5_v,
		case when c.Sum_6<=50 then c.t6_v else 0 end t6_v
 from c
 where c.Sum_2=50 or c.Sum_3=50 or c.Sum_4=50 or c.Sum_5=50 or c.Sum_6=50

才疏学浅,随便写写,占个位置 等大神的答案、
小野马1209 2020-12-17
  • 打赏
  • 举报
回复
这个我也想知道,每次去药店,社保扣减金额都是系统自动用其他药品凑金额
lich2005 2020-12-17
  • 打赏
  • 举报
回复
可以把数量先排序,然后 1-25 为一组A, 26-49 为一组B,数量 50的肯定直接取走了。 B组的数据由于都大于25,所以不存在两个数字相加的问题。 于是就A组的数字做循环,去尝试和B组的数字相加看是否50,等于50的就取走相应记录。 存在A组的两个数字相加后,再去和B组数字相加等于50的情况。 A + B = 50 ? A + A + B = 50 ? ...
AcHerat 元老 2020-12-17
  • 打赏
  • 举报
回复
不建议在sql中来实现回朔算法,可以看看回朔算法实现的原理
内容概要:本文围绕“阶梯碳下考虑P2G-CCS与供需灵活响应的IES优化调度”展开,基于Matlab平台构建综合能源系统(IES)在阶梯式碳交易机制下的优化调度模型。研究深度融合电制气(P2G)与碳捕集、利用与封存(CCS)技术,结合需求侧灵活响应机制,旨在提升系统的低碳运行能力与经济性。通过建立多能流耦合的优化模型,协调电力、天然气、热力等多种能源形式的协同调度,有效降低系统碳排放强度,并借助YALIMIP工具包调用求解器进行高效求解。文档提供了完整的代码实现、模型构建流程与结果分析方法,涵盖从问题建模到仿真实现的全过程,具备较强的可复现性与科研参考价值。; 适合人群:具备电力系统、能源系统或优化建模相关背景的研究生、高校教师及工程技术人员,尤其适合从事综合能源系统、碳减排策略、P2G与CCS技术集成研究的专业人员,需熟练掌握Matlab编程与基本的数学规划知识。; 使用场景及目标:①用于研究阶梯式碳交易政策下综合能源系统的低碳经济调度策略;②支撑P2G-CCS技术与需求响应机制在IES中的仿真集成与性能评估;③作为撰写高水平学术论文(如EI/SCI收录)的技术基础与复现资源,推动碳中和背景下能源系统优化方向的创新研究。; 阅读建议:建议结合百度网盘提供的完整代码与资料包,按照模块逐步调试程序,重点理解目标函数的设计逻辑、碳交易成本的建模方式、约束条件的数学表达及求解器的配置方法,同时关注多能耦合设备的建模细节,配合公众号“荔枝科研社”获取持续的技术支持与案例拓展。
内容概要:本文系统研究了基于卷积神经网络(CNN)与支持向量机(SVM)融合的CNN-SVM混合模型在数据分类预测中的应用,尤其聚焦于工业故障识别领域。通过Matlab平台实现,该方法首先利用CNN强大的多层次特征提取能力对原始输入数据进行深度特征学习,自动捕获关键局部模式与空间结构信息,随后将提取的高层特征作为输入传递至SVM分类器,借助SVM在高维空间中小样本条件下卓越的分类性能与泛化能力完成最终判别任务。文中详尽阐述了模型的整体架构设计、网络参数配置、训练优化流程及特征迁移机制,充分结合了深度学习在特征表达上的优势与传统机器学习在分类决策上的稳健性。实验部分通过实际故障数据集验证了该混合模型相较于单一CNN或SVM模型在分类准确率、鲁棒性和抗过拟合能力方面的显著提升,证明了其在复杂故障诊断任务中的有效性与先进性; 适合人群:具备一定机器学习与深度学习理论基础,熟悉Matlab编程环境,从事故障诊断、模式识别、智能制造、电力系统监控或工业数据分析等相关领域的研究生、科研人员及工程技术开发者; 使用场景及目标:① 应用于旋转机械、电力设备、航空航天等领域的多类别故障识别与状态监测;② 掌握深度特征提取与传统分类器融合的技术路径,提升小样本、高噪声环境下数据分类的精度与可靠性;③ 为撰写高水平学术论文、开展科研项目或工程实践提供可复现的算法框架与完整代码支持; 阅读建议:读者应深入理解CNN与SVM的协同工作机制,重点分析特征提取层与分类层之间的接口设计,建议动手运行并调试所提供的Matlab代码,尝试在不同数据集上进行迁移实验与参数调优,以全面掌握该混合模型的应用技巧与优化策略。

34,876

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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