dfs枚举所有情况,每本书都有选或者不选两种,不剪枝只有七十分,剩下的会超时。
剪枝:当前方案已经大于x,记录结果,不再继续往下选;
当前方案加上后续所有方案仍然小于x,直接return;
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int n, x, ans;
int a[50], b[50];
bool flag;
void dfs(int sum, int i) {
if (flag) {
return;
}
if (sum + b[n] - b[i - 1] < x) {
return;
}
if (sum == x) {
ans = x;
flag = 1;
return;
}
if (sum > x) {
ans = min(sum, ans);
}
if (i > n) {
return;
}
if (sum < x) {
dfs(sum, i + 1); //不选择这本书
dfs(sum + a[i], i + 1); //选择这本书
}
}
int main() {
cin >> n >> x;
ans = 3e5 + 1;
for (int i = 1; i <= n; i++) {
cin >> a[i];
b[i] = b[i - 1] + a[i];
}
dfs(0, 1);
cout << ans;
return 0;
}