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

时间:2019-06-08 11:51:44

标签: python 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>    

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

1 个答案:

答案 0 :(得分:0)

有两种方法可以执行此操作,方法是在SQL语句中使用CASE,或者如果您有一个非常大的列表,则根据交易类型引入一个包含+1或-1的字段,然后当您执行值乘以该值,最后求和。例如,在这里;

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,在SELECT字段列表中也可以使用Tran.type(用于按Tran.Type和Values列出)。然后编写简单的代码应该不会有问题。

尽管如此,我还是请您不要在SQL中使用VALUEVALUES,因为它与RESERVED KEYWORDs非常相似(只是一个建议

由于您没有指定要使用的数据库(语法不同),而且因为您声称类型很多,所以我不在这里放置CASE示例。

如果您更喜欢编码而不是SQL,则可以通过定义一个字典来实现同样的目的,其中每个 type 取决于 type 分别容纳+1或-1。当用户输入值时,您可以乘以 type 并将其完成。

希望这会有所帮助。