tyvj p1340 送礼物

来源:互联网 发布:人力资源大数据分析 编辑:程序博客网 时间:2024/04/28 08:14

时间: 1000ms / 空间: 131072KiB / Java类名: Main
描述

作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了。某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_-b),他一次可以搬动重量和在w(w<=2^31-1)以下的任意多个物品。GY希望一次搬掉尽量重的一些物品,请你告诉他在他的力气范围内一次性能搬动的最大重量是多少。
输入格式

第一行两个整数,分别代表W和N。
以后N行,每行一个正整数表示G[i],G[i]<= 2^31-1。
输出格式

仅一个整数,表示GY在他的力气范围内一次性能搬动的最大重量。
测试样例1

输入

20 5
7
5
4
18
1
输出

19
备注

对于20%的数据 N<=26
对于40%的数据 W<=2^26
对于100%的数据 N<=45 W<=2^31-1


【分析】
折半搜索。
然而中间二分一直挂。


【代码】

//tyvj 1340 送礼物 #include<cstdio>#include<cstring>#include<algorithm>#define ll long long#define M(a) memset(a,0,sizeof a)#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;int n,tp=0,tp2,ans;long long w;int a[49],cun[9000001];bool vis[49];inline int max(int x,ll y) {if(x>y) return x;return y;}inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}inline bool cmp(int x,int y) {return x>y;}inline void dfs(int l,int r,ll now){    int i,j;    if(now>w) return;    cun[++tp]=now;    fo(i,l,r)      dfs(i+1,r,(long long)now+a[i]);}inline void dfs2(long long now,int step,int dep){    if (now>w) return ;    if (step>dep)    {        int l=1,r=tp;        while (l<r)        {            int mid=(l+r)/2+1;            if ((long long)now+cun[mid]>w) r=mid-1;            else l=mid;        }        long long tmp=(long long)now+cun[l];        if (tmp>w||tmp<0) return ;        ans=max(ans,tmp);        return;    }    dfs2(now+a[step],step+1,dep);    dfs2(now,step+1,dep);}int main(){    int i,j;    w=read();n=read();    fo(i,1,n)      a[i]=read();    int mid=n/2;    dfs(1,n/2,0);    sort(cun+1,cun+tp+1);    dfs2(0,n/2+1,n);    printf("%d\n",ans);    return 0;}
1 0
原创粉丝点击