繁体   English   中英

如何找到等于给定总和的所有组合?

[英]How to find all combinations that equal a given sum?

在SQL中,我有一个事务类型列表和一个值。 简单的例子如下。

|-----------|--------|
| Tran.Type | Value  | 
|-----------|--------|
|     04    |   10   |
|-----------|--------|
|     07    |   10   |
|-----------|--------|
|     04    |   5    |
|-----------|--------|
|     01    |   8    | 
|-----------|--------|



|-----------------|
| Current Balance |
|-----------------|
|        13       |
|-----------------|

目标是对值求和并获得数字13.在此示例中很容易发现类型07为负数。 所以10-10 + 5 + 8 = 13

但是当交易数量达到20和10种不同类型时非常困难。 值也是正面和负面的。

到目前为止,我想出了这个。

import itertools
numbers = list(map(int, input("Enter multiple values: ").split()))
expectedSum = int(input("Enter expected value: "))
result = [seq for i in range(len(numbers), 0, -1) for seq in 
itertools.combinations(numbers, i) if sum(seq) == expectedSum]
print (result)<code>    

任何想法如何将类型合并到结果部分? 如果该类型是相反的值?

有几种方法可以做到这一点,在SQL语句中使用CASE ,或者如果你有一个非常大的列表然后根据事务类型引入一个包含+1或-1的字段,那么当你执行这些值时MULTIPLY值,最后做一笔总和。 例子,在这里;

ALTER TABLE Tran ADD COLUMN tran_multiple INT default 1;

-- update each value as req.
UPDATE Tran set tran_multiple=-1 WHERE Tran.id = xxxx; 

SELECT sum (TranValue.Value * Tran.tran_multiple) as Val From TranValue 
    INNER JOIN Tran on TranValue.Type = Tran.Type 

在这里,我假设您的表TranValue存储值。 当然,你可以使用Group By子句GROUP BY Tran.type在你的声明,随着Tran.type在SELECT字段列表(由Tran.Type和价值观上市)。 然后编写一个简单的代码应该不是问题。

虽然,我会请求你不要在你的SQL中使用VALUEVALUES ,因为它与RESERVED KEYWORDs非常相似( 只是一个建议

我没有在这里放置CASE示例,因为您没有指定您正在使用的数据库(语法各不相同),并且因为您声称存在大量类型。

如果你喜欢的编码,而不是SQL,则同样可以通过定义字典,其中每种类型的成立做了+1或-1取决于类型 ,然后当用户输入的值,你可以乘类型和完成它。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM