假设我们有一个称为nums的数字列表,并且还有一个正值K。我们可以对nums进行这三个操作中的任何一个-
将一个数字设为负数
将数字的索引(从索引1开始)添加到数字本身
从数字本身减去数字的索引。
最后,通过对每个元素仅执行一次这些操作,我们必须检查给定数组是否可以在数组的总和变为k时进行转换。
因此,如果输入像nums = [1,2,3,7] k = 8,则输出将为True,因为我们可以从2和3中减去2和3的索引,以使数组成为[1,0, 0,7],因此总和为8 = k。
为了解决这个问题,我们将遵循以下步骤-
大小:= 100
定义功能 is_ok()。这将需要i,total,k,nums,table
n:= nums的大小
如果合计<= 0,则
返回False
如果i> = n,则
返回True
如果总数等于k,则
返回False
如果table [i,total]不为-1,则
返回表[i,总计]
table [i,total]:= 1,当(is_ok(i + 1,total-2 * nums [i],k,nums,table)为非零或is_ok(i + 1,total,k,nums,table )非零),否则为0
table [i,total]:= 1(is_ok(i + 1,total-(i + 1),k,nums,table)或table [i,total]),否则为0
table [i,total]:= 1(is_ok(i + 1,total + i + 1,k,nums,table)或table [i,total]),否则为0
返回表[i,总计]
从主要方法中执行以下操作-
总计:=所有元素的总和
table:=长度与大小相同的数组,并用-1填充
对于介于0到大小范围内的i,执行
table [i]:=长度与大小相同的数组,并用-1填充
返回is_ok(0,total,k,nums,table)
让我们看下面的实现以更好地理解-
size = 100 def is_ok(i, total, k, nums, table): n = len(nums) if total <= 0: return False if i >= n: if total == k: return True return False if table[i][total] != -1: return table[i][total] table[i][total] = is_ok(i+1, total - 2 * nums[i], k, nums, table) or is_ok(i+1, total, k, nums, table) table[i][total] = is_ok(i+1, total - (i+1), k, nums, table) or table[i][total] table[i][total] = is_ok(i+1, total + i + 1, k, nums, table) or table[i][total] return table[i][total] def solve(nums, k): total = sum(nums) table = [-1]*size for i in range(size): table[i] = [-1]*size return is_ok(0, total, k, nums, table) nums = [1,2,3,7] k = 8 print(solve(nums, k))
[1,2,3,7], 8输出结果
True