![]() |
1
36
这个问题归结为 0-1 Knapsack Problem ,试图找到一个具有精确和的集合。解取决于约束条件,在一般情况下,这个问题是NP完全问题。
但是,如果最大搜索和(我们称之为
让我们编写一个函数的代码
然后,让我们分析递归情况(即:
通过检查
现在,可以对函数进行编码
免责声明:此解决方案表示有两个子集[10,10]和10。这是因为它假定前十个不同于后十个。该算法可以固定为假定两个十位数相等(因此回答一个十位数),但这有点复杂。 |
![]() |
2
2
所以,逻辑是对数字进行反向排序,假设数字列表是 L 要形成的总和是 S .
然后,我们通过这个循环,从中选择一个数字
L
有条不紊地说是
我
.
可能有两种情况
我
是不是和的一部分。
所以,我们假设
我
是解决方案的一部分,然后问题减少到
L
存在
现在为了减少这个问题,如果l中的数字大于s,我们去掉它们以减少复杂性,直到l为空,在这种情况下,所选的数字不是我们解决方案的一部分,我们返回false。
如果L只剩下1个元素,那么要么它是s的一部分,然后我们返回true,要么它不是,那么我们返回false,循环将遍历其他的数字。
请注意循环中是否使用了b.。但是b只是我们的列表。我在可能的地方进行了四舍五入,这样我们就不会因为python中的浮点计算而得到错误的答案。
这个解决方案工作得很快。比上面解释的更快。 但是这只适用于正数。 但是,如果有一个解决方案,那么它也会很好地工作,否则需要花费很多时间才能摆脱循环。 一个例子是这样的,比如说
只是比较一下我在电脑上运行的不是很好。 使用
和 S=2000 我的循环运行了1018次31毫秒。 之前的代码循环运行了3415587次,大约需要16秒。 但是,如果一个解决方案不存在,我的代码运行超过几分钟,所以我停止了它,以前的代码运行大约17毫秒,以前的代码也使用负数。 所以我认为可以做些改进。 |
![]() |
3
0
这个python代码按照您的要求执行,它将打印一对唯一的数字,其和等于目标变量。 if target number is 8, it will print: 1 7 2 6 3 5 3 5 5 3 6 2 9 -1 5 3 |
![]() |
4
0
我找到了一个答案,其中运行时复杂度o(n)和空间复杂度约o(2n),其中n是列表的长度。 答案满足以下限制:
代码如下,然后是解释:
最复杂的步骤是步骤3,它涉及到搜索字典,但是由于搜索字典通常很快,几乎是恒定的复杂性。(尽管最坏的情况是O(n),但对于整数键不应该发生。)因此,假设搜索是恒定的复杂性,总的复杂性是O(n),因为我们只分别迭代列表多次。 欢迎提供更好解决方案的建议:) |