#240. 受限子集和问题

    ID: 240 Type: Default 1000ms 256MiB Tried: 0 Accepted: 0 Difficulty: (None) Uploaded By: Tags>codingbatRecursion-2gesp6DP线性DP

受限子集和问题

受限子集和

题目背景

聪聪正在解决一个有趣的数字谜题。他得到了一组整数和一个目标和,需要从这组整数中选择一些数字,使它们的和等于目标和。然而,这个谜题有一个特殊的规则,让聪聪感到有些困惑。

题目描述

给定一个整数数组 nums 和一个目标整数 target。判断是否可能从 nums 中选择一个子集,使得该子集的元素之和等于 target。 此外,还有一个额外的约束:如果数组中存在相邻且值相同的数字,那么它们必须要么全部被选中,要么全部不被选中。 例如,对于数组 [1, 2, 2, 2, 5, 2],中间的三个 2 必须作为一个整体被选择或不被选择。(可以使用一个循环来确定相同值的连续范围。)

输入格式

输入包含一行,首先是一个整数 start (通常为 0,表示从数组的起始索引开始处理,但在此问题中,它可能只是一个占位符,实际处理时可以忽略或用于递归的起始索引),然后是一个整数数组 nums,最后是一个整数 target

start [num1 num2 ... numN] target

输出格式

输出以如下格式输出到标准输出中。

boolean

样例

0 [2 4 8] 10
true
0 [1 2 4 8 1] 14
true
0 [2 4 4 8] 14
false

样例解释

  • 样例 1: 数组 [2, 4, 8],目标和 10。选择 28,它们的和为 10。满足条件,输出 true
  • 样例 2: 数组 [1, 2, 4, 8, 1],目标和 14。选择 248,它们的和为 14。满足条件,输出 true
  • 样例 3: 数组 [2, 4, 4, 8],目标和 14
    • 如果选择两个 4,当前和为 8,还需要 14 - 8 = 6。从剩余的 [2, 8] 中无法得到 6
    • 如果不选择两个 4,当前和为 0,需要 14。从剩余的 [2, 8] 中无法得到 14 (只能得到 2, 8, 10)。
    • 因此,无法找到满足条件的子集,输出 false

数据范围

每个测试用例的时间限制为 1 秒,内存限制为 1024 KiB。