3685. Subsequence Sum After Capping Elements
Description
You are given an integer array nums of size n and a positive integer k.
An array capped by value x is obtained by replacing every element nums[i] with min(nums[i], x).
For each integer x from 1 to n, determine whether it is possible to choose a subsequence from the array capped by x such that the sum of the chosen elements is exactly k.
Return a 0-indexed boolean array answer of size n, where answer[i] is true if it is possible when using x = i + 1, and false otherwise.
Example 1:
Input: nums = [4,3,2,4], k = 5
Output: [false,false,true,true]
Explanation:
- For
x = 1, the capped array is[1, 1, 1, 1]. Possible sums are1, 2, 3, 4, so it is impossible to form a sum of5. - For
x = 2, the capped array is[2, 2, 2, 2]. Possible sums are2, 4, 6, 8, so it is impossible to form a sum of5. - For
x = 3, the capped array is[3, 3, 2, 3]. A subsequence[2, 3]sums to5, so it is possible. - For
x = 4, the capped array is[4, 3, 2, 4]. A subsequence[3, 2]sums to5, so it is possible.
Example 2:
Input: nums = [1,2,3,4,5], k = 3
Output: [true,true,true,true,true]
Explanation:
For every value of x, it is always possible to select a subsequence from the capped array that sums exactly to 3.
Constraints:
1 <= n == nums.length <= 40001 <= nums[i] <= n1 <= k <= 4000
Solutions
Solution 1
Thinking
For every cap \(x=1\ldots n\), treat larger entries as \(x\) and ask whether some subsequence sums to \(k\). A fresh knapsack per \(x\) is \(O(n^2k)\) and too slow for \(n\le 4000\).
Values already \(\le x\) form a \(0\)-\(1\) knapsack; the \(c\) values above \(x\) become \(c\) copies of \(x\). Increase \(x\) and insert each newly uncapped value once.
On the current reachable set, test whether some \(t\le k\) leaves \(k-t\) writable as at most \(c\) copies of \(x\). A bitset makes each \(x\) an \(O(k/w)\) query.
1 | |
1 | |
1 | |
1 | |