zoukankan      html  css  js  c++  java
  • 送礼物(双向DFS)

    达达帮翰翰给女生送礼物,翰翰一共准备了N个礼物,其中第i个礼物的重量是G[i]。

    达达的力气很大,他一次可以搬动重量之和不超过W的任意多个物品。

    达达希望一次搬掉尽量重的一些物品,请你告诉达达在他的力气范围内一次性能搬动的最大重量是多少。

    输入格式
    第一行两个整数,分别代表W和N。

    以后N行,每行一个正整数表示G[i]。

    输出格式
    仅一个整数,表示达达在他的力气范围内一次性能搬动的最大重量。

    数据范围
    1≤N≤46,
    1≤W,G[i]≤231−1
    输入样例:
    20 5
    7
    5
    4
    18
    1
    输出样例:
    19

    
    #include <iostream>
    #include<algorithm>
    #include <cstring>
    using namespace std;
    const int N = 46;
    typedef long long LL;
    int k ,cnt;
    int w[1 << 25];
    int n , m ;
    int p[N];
    int ans;
    void dfs1(int u ,int s)
    {
        if(u == k)
        {
            w[cnt++] = s;
            return ;
        }
        
        dfs1(u+1,s);
        
        if((LL)s + p[u] <= m) dfs1(u + 1, s + p[u]);
        
    }
    
    void dfs2(int u , int s)
    {
        if(u >= n)
        {
            int l  = 0 , r = cnt - 1;
            
            while(l < r)
            {
                int mid = l + r + 1>> 1;
                if((LL)s + w[mid] <= m)l = mid;
                else r = mid -1;
            }
            ans = max(ans,s + w[l]);
            return ;
        }
        dfs2(u+1,s);
        if((LL) s + p[u] <= m) dfs2(u +1,s + p[u]);
    }
    
    int main()
    {
        cin >> m>>n;
        for(int i = 0 ; i < n ;  i++) cin >> p[i];
        
         k = n /2 + 2;
        
        sort(p,p+n);
        reverse(p,p+n);
        
        dfs1(0,0);
        
        sort(w,w+cnt);
        cnt = unique(w,w+cnt)-w;
        
        dfs2(k,0);
        
        cout << ans ;
        
        return 0;
    }
    
  • 相关阅读:
    TCP的拥塞控制(详解)
    TCP加速–初始拥塞窗口调整
    HTTPS 之 TLS 性能调优
    https抓包分析——wireshark抓包分析TLSv2(详细)
    HTTPS的由来详述,数字证书实现HTTPS
    详解Nginx服务器配置
    java:tomcat(负载均衡)nginx的应用配置
    QML对象构造顺序
    QML属性动态绑定
    mysql去重查询某列
  • 原文地址:https://www.cnblogs.com/wk-love-zsy/p/14179779.html
Copyright © 2011-2022 走看看