这道题目我WA了好久,后来才发现忘记加longlong了,一道dfs水题,剪枝也比较容易想到。
主要是加一个预处理,可以减少很多时间,然后就没有然后了。
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define For(i, n, m) for(i = n;i <= m; ++i)
#define Fod(i, n, m) for(i = n;i >= m; --i)
using namespace std;
long long ans, n, m, a[10010], sum[10010];
void dfs(int x ,int y) {
if(y > ans)
ans = y;
if(x < 1)
return;
int i;
Fod(i, x, 1){
if(y + sum[i] <= ans)
continue;
if(y + a[i] > m)
continue;
dfs(i - 1, y + a[i]);
}
}
int main() {
int j, k, i;
scanf("%lld%lld", &n, &m);
For(i, 1, n) {
scanf("%lld", &a[i]);
sum[i] = sum[i - 1] + a[i];
}
dfs(n, 0);
printf("%lld", ans);
return 0;
}
就是如此easy,大家加油吧