1 条题解
-
1
#include #include #include #include using namespace std;
int main() { int W, N; cin >> W >> N; vector G(N); for (int i = 0; i < N; ++i) { cin >> G[i]; }
// 折半:前半部分和后半部分 int mid = N / 2; vector<long long> left_sums, right_sums; // 枚举前半部分所有子集 for (int mask = 0; mask < (1 << mid); ++mask) { long long sum = 0; for (int i = 0; i < mid; ++i) { if (mask & (1 << i)) { sum += G[i]; } } if (sum <= W) left_sums.push_back(sum); } // 枚举后半部分所有子集 for (int mask = 0; mask < (1 << (N - mid)); ++mask) { long long sum = 0; for (int i = mid; i < N; ++i) { if (mask & (1 << (i - mid))) { sum += G[i]; } } if (sum <= W) right_sums.push_back(sum); } // 对右半部分排序,便于二分查找 sort(right_sums.begin(), right_sums.end()); long long max_weight = 0; for (long long left_sum : left_sums) { long long remaining = W - left_sum; // 在 right_sums 中找不超过 remaining 的最大值 auto it = upper_bound(right_sums.begin(), right_sums.end(), remaining); if (it != right_sums.begin()) { --it; max_weight = max(max_weight, left_sum + *it); } } cout << max_weight << endl; return 0;}
- 1
信息
- ID
- 82
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 9
- 标签
- 递交数
- 33
- 已通过
- 3
- 上传者