查找列表中总和等于给定数字的不同部分
我想从没有重复数字的输入列表中找到总和等于 K 的不同元组。
Input: A=[1, 2, 3], K = 3
Output:
(1, 2)
(2, 1)
(3)
请注意 - (2,3) 与 (3,2) 不同。
我正在做什么:
def unique_combination(l, sum, K, local, A):
# If a unique combination is found
if (sum == K):
print("(", end="")
for i in range(len(local)):
if (i != 0):
print(" ", end="")
print(local[i], end="")
if (i != len(local) - 1):
print(", ", end="")
print(")")
return
# For all other combinations
for i in range(l, len(A), 1):
# Check if the sum exceeds K
if (sum + A[i] > K):
continue
# Check if it is repeated or not
if (i > l and
A[i] == A[i - 1]):
continue
# Take the element into the combination
local.append(A[i])
# Recursive call
unique_combination(i+1, sum + A[i],
K, local, A)
# Remove element from the combination
local.remove(local[len(local) - 1])
def myFunc(A, K):
# Sort the given elements
A.sort(reverse=False)
local = []
unique_combination(0, 0, K, local, A)
arr = [1,2,3,4,6,7]
target = 8
myFunc(arr, target)
这个函数返回:
Input: A=[1,2,3,4,6,7], K = 8
Output:
(1, 3, 4)
(1, 7)
(2, 6)
我还想要其他组合,例如: (1,4,3),(1,3,4),(4,1,3),(4,3,1),(3,1,4),(3,4,1),(7 , 1), (2, 6)
那么,我应该如何处理代码才能实现我的结果......
I want to find the distinct tuples whose sum equals to K, from an input list with no repeated numbers.
Input: A=[1, 2, 3], K = 3
Output:
(1, 2)
(2, 1)
(3)
Note that - (2,3) is not same as (3,2).
What I am doing:
def unique_combination(l, sum, K, local, A):
# If a unique combination is found
if (sum == K):
print("(", end="")
for i in range(len(local)):
if (i != 0):
print(" ", end="")
print(local[i], end="")
if (i != len(local) - 1):
print(", ", end="")
print(")")
return
# For all other combinations
for i in range(l, len(A), 1):
# Check if the sum exceeds K
if (sum + A[i] > K):
continue
# Check if it is repeated or not
if (i > l and
A[i] == A[i - 1]):
continue
# Take the element into the combination
local.append(A[i])
# Recursive call
unique_combination(i+1, sum + A[i],
K, local, A)
# Remove element from the combination
local.remove(local[len(local) - 1])
def myFunc(A, K):
# Sort the given elements
A.sort(reverse=False)
local = []
unique_combination(0, 0, K, local, A)
arr = [1,2,3,4,6,7]
target = 8
myFunc(arr, target)
This function Return:
Input: A=[1,2,3,4,6,7], K = 8
Output:
(1, 3, 4)
(1, 7)
(2, 6)
I also want the other combination like:
(1, 4, 3), (1, 3, 4), (4, 1, 3), (4, 3, 1), (3, 1, 4), (3, 4, 1), (7, 1), (2, 6)
So, What should I do with the code to achieve my result...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您原来的函数正在正确生成可能的组合。唯一的问题是您正在打印它,而不是将其保存在列表中以供以后使用。
我修改了它,以便将结果保存到一个列表中,该列表可以输入到生成列表的所有排列(也以递归方式实现)的函数。
总体来说,做法是:
goal
请注意,这是 Subset Sum 的一个实例问题,这是一个困难的优化问题。下面的解决方案对于大型集合来说不能很好地扩展。
Your original function was generating properly the possible combinations. The only problem was that you were printing it, instead of saving it in a list to use later.
I modified it so it saves the result into a list, that can be input to a function that generates all permutations (also implemented recursively) of a list.
Overall, the approach is:
goal
Note that this is an instance of the Subset Sum Problem, which is a difficult optimisation problem. The solution below does not scale well for large sets.
使用
itertools
遍历候选者:输出:
Using
itertools
to go through the candidates:Output:
使用排列
输出:
一个线性解决方案:
输出:
use permutations
Output:
One liner solution :
Output: