在有限多的不大于100的正整数中,找出尽量多个相加起来值介于98~102之间的组合...
問(wèn)題描述:<?XML:NAMESPACE PREFIX = O />
在有限多的不大于100的正整數(shù)中,找出盡量多個(gè)相加起來(lái)值介于98~102之間的組合。
組合的個(gè)數(shù)限制在2 和3。
比如有數(shù)字(39,40,1,55,17,17……N)數(shù)字可以有重復(fù)。
找出的組合有(50,50),(21,41,39),(48,50)……M。在上面的數(shù)字在組合中每次只能出現(xiàn)一次(比如數(shù)字中40只出現(xiàn)過(guò)一次,那在組合中也只能出現(xiàn)一次。17出現(xiàn)過(guò)兩次那在組合中最多兩次)
?
實(shí)現(xiàn)現(xiàn)代碼
-- 測(cè)試數(shù)據(jù), value 列放要處理的數(shù)(此處隨機(jī)生成100個(gè)數(shù)據(jù))
DECLARE @t TABLE(
??? id int identity,
??? value int)
INSERT @t SELECT TOP 100 CHECKSUM(NEWID()) % 100 FROM syscolumns
?
--=====================================================
-- 組合處理
--=====================================================
DECLARE @r TABLE(
??? id int IDENTITY,
??? vs varchar(100))
DECLARE @tid TABLE(id int PRIMARY KEY)
?
IF OBJECT_ID('tempdb..#1') IS NOT NULL
??? DROP TABLE #1
SELECT
??? id1 = A.id, value1 = A.value,
??? id2 = B.id, value2 = B.value,
??? value = A.value + B.value,
??? flag = CASE WHEN A.value + B.value BETWEEN 98 AND 102 THEN 1 ELSE 0 END
INTO #1
FROM @t A, @t B
WHERE A.id < B.id
?
DECLARE tb CURSOR STATIC LOCAL
FOR
SELECT id1, id2, id3, vs
FROM(
??? -- 二次組合的
??? SELECT flag = 2,
??????? A.id1, A.id2, id3 = NULL,
??????? vs = RTRIM(A.value1) + ',' + RTRIM(A.value2)
??? FROM #<?XML:NAMESPACE PREFIX = ST1 />1 A
??? WHERE flag = 1
??? UNION ALL
??? -- 三次組合的
??? SELECT flag = 3,
??????? A.id1, A.id2, id3 = B.id,
??????? RTRIM(A.value1) + ',' + RTRIM(A.value2) + ',' + RTRIM(B.value)
??? FROM #1 A, @t B
??? WHERE A.id2 < B.id
??????? AND A.value + B.value BETWEEN 98 AND 102
)A
ORDER BY flag DESC
?
-- 僅選出復(fù)合需求的數(shù)據(jù)(過(guò)濾重復(fù)數(shù)據(jù))
DECLARE @id1 int, @id2 int, @id3 int, @values varchar(100)
OPEN tb
FETCH tb INTO @id1, @id2, @id3, @values
WHILE @@ROWCOUNT > 0
BEGIN
??? IF NOT EXISTS(
??????????? SELECT * FROM @tid WHERE id IN(@id1, @id2, @id3))
??? BEGIN
??????? INSERT @r VALUES(@values)
??????? INSERT @tid SELECT *
??????? FROM(
??????????? SELECT id = @id1 UNION ALL SELECT @id2 UNION ALL SELECT @id3
??????? )A WHERE id > 0
??? END
??? FETCH tb INTO @id1, @id2, @id3, @values
END
CLOSE tb
DEALLOCATE tb
?
-- 顯示結(jié)果
SELECT vs FROM @r
轉(zhuǎn)載于:https://www.cnblogs.com/wayne-ivan/archive/2007/06/29/800459.html
總結(jié)
以上是生活随笔為你收集整理的在有限多的不大于100的正整数中,找出尽量多个相加起来值介于98~102之间的组合...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 由Docker的MySQL官方镜像配置的
- 下一篇: 对List集合中的元素进行排序