用Python编写一个程序,找出我们可以排列符号的方式来得到目标值的数量?

用Python编写一个程序,找出我们可以排列符号的方式来得到目标值的数量?

假设我们有一个名为nums的非负数列表,还有一个整数目标。我们必须找到排列+和-在nums中的数量,使得表达式等于目标值。

因此,如果输入是nums = [2, 3, 3, 3, 2],target = 9,则输出将为2,因为我们可以-2 + 3 + 3 + 3 + 2和2 + 3 + 3 + 3 – 2。

要解决这个问题,我们将按照以下步骤操作:

  • s:集合nums中所有数字的和

  • 如果(s+target)的模为2并且不等于0或目标值大于s,则执行以下步骤:

    • 返回0
  • W:(s+target)的商

  • dp1:一个大小为(W+1)的列表,其中所有元素都为0

  • dp1[0]:1

  • dp2:一个大小为(W+1)的列表,其中所有元素都为0

  • 对于nums的范围,执行以下步骤:

    • 对于W + 1范围内的每个j,执行以下步骤:
      • 如果j大于等于nums[i],则执行以下步骤:

      • dp2[j] = dp2[j] + dp1[j – nums[i]]

    • 对于W + 1范围内的每个j,执行以下步骤:

      • dp1[j] = dp1[j] + dp2[j]

      • dp2[j] = 0

  • 返回dp1的最后一个元素

让我们看下面的实现以获得更好的理解:

示例

class Solution:
   def solve(self, nums, target):
      s = sum(nums)
      if (s + target) % 2 != 0 or target > s:
         return 0
      W = (s + target) // 2
      dp1 = [0] * (W + 1)
      dp1[0] = 1
      dp2 = [0] * (W + 1)
      for i in range(len(nums)):
         for j in range(W + 1):
            if j >= nums[i]:
               dp2[j] += dp1[j - nums[i]]
            for j in range(W + 1):
               dp1[j] += dp2[j]
               dp2[j] = 0
         return dp1[-1]

ob = Solution()
nums = [2, 3, 3, 3, 2]
target = 9
print(ob.solve(nums, target))

输入

[2, 3, 3, 3, 2], 9

输出

2

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程