算法思想:
对每一个数,可以选与不选,那么就可以得到所有的非空子序列的和。
例题:
class Solution {
typedef long long LL;
typedef pair<LL, int> pli;
public:
long long kSum(vector<int>& nums, int k) {
int n = nums.size();
LL sum = 0;
for(int i = 0; i < n; ++i){
if(nums[i] > 0) sum += nums[i];
else nums[i] = -nums[i];
}
sort(nums.begin(), nums.end());
priority_queue<pli> q;
q.push({sum, 0});
while(--k){
auto [sum, i] = q.top();
q.pop();
if(i < n){
q.push({sum - nums[i], i + 1}); //保留 nums[i - 1]
if(i > 0) q.push({sum + nums[i - 1] - nums[i], i + 1}); //不保留 nums[i - 1]
}
}
return q.top().first;
}
};