题目意思:给定n个数字,和一个限制T,选取若干个数字,设这些数字的和为S,问在S<=T的情况的,S最大为多少。
这道题目可以说是校赛C题的加强版,校赛C题给的数据范围是20,直接二进制枚举就可以(二进制枚举的时间复杂度是O(2^n)),显然这道题目二进制枚举是会T掉的。
那么我们可以把整个数组分成两部分进行二进制枚举,分别把两个部分枚举出来的子集的答案放入两个数组,然后对任意一个数组排序,假设排序的数组是v2,没排序的数组是v1
枚举v1中的每个元素,在v2中二分找第一个大于(T-v[i])的元素,然后前一个元素就是我们需要的,还需要注意一些细节,如果不存在这样的元素应该特判。
// #pragma GCC optimize(2)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include