题意:给n个物品,以及背包的容量w,求最多能装下多少重量的物品。
题解:直接01背包存不下所以二分搜索
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; #define ll long long ll a[55],s[1<<25]; ll ans, n, w, tot; void DFS1(ll x,ll v) { if(x>n) { s[++tot]=v; return; } if(a[x]+v<=w) DFS1(x+1,a[x]+v); DFS1(x+1,v); } void DFS2(ll x, ll v) { if(x>=(n+1)>>1) { ll l=lower_bound(s+1,s+tot+1,w-v)-(s+1); ans=max(ans,v+s[l]); return; } if(a[x]+v<=w) DFS2(x+1,a[x]+v); DFS2(x+1,v); } int main() { scanf("%d%d",&w,&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+n+1); ll mid=(n+1)>>1; DFS1(mid,0); sort(s+1,s+tot+1); DFS2(1,0); printf("%d",ans); return 0; }