AcWing 1047. 糖果 DFS 预处理后缀和进行剪枝
原题链接
简单
作者:
NIKOUDAYOU
,
2025-04-04 15:31:50
· 山东
,
所有人可见
,
阅读 2
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 110;
int a[N];
int suffix_sum[N];
int n, k;
int max_sum = 0;
void dfs(int i, int current_sum, int remainder) {
if (i == n) {
if (remainder == 0 && current_sum > max_sum) {
max_sum = current_sum;
}
return;
}
if (current_sum + suffix_sum[i] <= max_sum) {
return;
}
int new_sum = current_sum + a[i];
int new_remainder = (remainder + a[i]) % k;
dfs(i + 1, new_sum, new_remainder);
dfs(i + 1, current_sum, remainder);
}
int main() {
cin >> n >> k;
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
sort(a, a + n, greater<int>());
for (int i = n - 1; i >= 0; --i) {
suffix_sum[i] = a[i] + suffix_sum[i + 1];
}
dfs(0, 0, 0);
cout << max_sum << endl;
return 0;
}