10000000。注意到最多只有30个物品,那么直接DFS,加点剪枝就好了...
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
typedef long long ll;
bool cmp(int x,int y)
{
return x>y;
}
int n,m,k;
int a[44];
int vis[33];
ll sum[33];
ll ans;
void dfs(int x,ll w)
{
if (ans<w) ans=w;
if (sum[n]-sum[x-1]+w<=ans) return;
for (int j=x; j<=n; j++)
if (!vis[j] && w+a[j]<=m)
{
vis[j]=true;
dfs(j+1,w+a[j]);
vis[j]=false;
}
}
int main()
{
// freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&m))
{
for (int i=1; i<=n; i++)
scanf("%d",&a[i]);
sort(a+1,a+1+n,cmp);
memset(sum,0,sizeof sum);
for (int i=1; i<=n; i++)
sum[i]=sum[i-1]+(ll)a[i];
memset(vis,false,sizeof vis);
ans=sum[n];
if (ans<=m)
{
cout<<ans<<endl;
continue;
}
for (int i=n; i>0; i--)
if (ans>m)
{
ans-=a[i];
}
else break;
dfs(1,0);
cout<<ans<<endl;
}
return 0;
}