题意:给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;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注