思路
其实还是一知半解
用前缀和优化的DFS
先做个前缀和
然后每次找一个数,如果这个数前面所有的数加上这个数都可以取,就直接取
不行的话就在这个数的前面找数,然后判断能否全部取走,能取走就取走,然后得到最大值,然后最终是用不可以取走所有前面的情况下在从前面重新开始枚举。
还不太懂,但要是可以把这题搞懂,对搜索水平会有很大的提升!
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, c;
const int N = 10005;
int a[N], sum[N];
int ans = 0;void dfs(int cnt, int x)
{
if (x > c){
return;}if (sum[cnt - 1] + x <= c){
ans = max(ans, sum[cnt - 1] + x);return;}ans = max(ans, x);for (int i = 1; i < cnt; i ++ ){
dfs(i, x + a[i]);}
}signed main()
{
cin >> n >> c;for (int i= 1; i <= n; i ++ ){
cin >> a[i];sum[i] = sum[i - 1] + a[i];}dfs(n + 1, 0);cout << ans << endl;return 0;
}