→题目链接←
神奇的背包dfs
代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<algorithm>
#include<cstring>
#define inf 999999999
#define ll long long
using namespace std;
int n,m;
ll a[1010];
ll sum[1010];
ll ans=0;
void dfs(int x,ll w){
if(w>m)return;
if(sum[x-1]+w<=m){
ans=max(ans,sum[x-1]+w);
return;
}
ans=max(ans,w);
for(int i=1; i<x; i++){
w+=a[i];
dfs(i,w);
w-=a[i];
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)scanf("%lld",&a[i]),sum[i]=sum[i-1]+a[i];
dfs(n+1,0);
printf("%lld\n",ans);
return 0;
}