• HDU


    题意:有5个背包,分别装着5座山上采的蘑菇,已知在其中n(1<=n<=5)座山上采的蘑菇数量,剩下的5-n座未知,采完后,要求有3个背包的蘑菇重量正好是1024的整数倍,求另外两个背包重量和不断被拿走1024直至重量不超过1024后的最大值。

    分析:剩下的5-n座未知是解题关键。背包容量为2012。显然,最终的背包重量和最多为1024。

    1、n=1,剩下的4个未知包中拿出两个,和这个已知的包凑成1024的整数倍,另外两个凑成1024。

    2、n=2,用一个未知的包和这两个已知的包凑成1024的整数倍,另外两个凑成1024。

    3、n=3,用一个未知的包和其中两个已知的包凑成1024的整数倍,用剩下的已知包和另外一个未知包凑成1024。

    4、n=4,

    (1)若其中三个已知包是1024的整数倍,则另外一个已知包一定能与剩下的未知包凑成1024。

    (2)若任何三个已知包都不是1024的整数倍,则任选两个已知包与剩下的未知包凑成1024的整数倍,取剩下的两个已知包的重量和经不断拿走1024后的最大值。

    5、n=5,完全按题意即可。

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<cctype>
    #include<cmath>
    #include<iostream>
    #include<sstream>
    #include<iterator>
    #include<algorithm>
    #include<string>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    #include<deque>
    #include<queue>
    #include<list>
    #define lowbit(x) (x & (-x))
    const double eps = 1e-8;
    inline int dcmp(double a, double b){
        if(fabs(a - b) < eps) return 0;
        return a > b ? 1 : -1;
    }
    typedef long long LL;
    typedef unsigned long long ULL;
    const int INT_INF = 0x3f3f3f3f;
    const int INT_M_INF = 0x7f7f7f7f;
    const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
    const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
    const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
    const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
    const int MOD = 1e9 + 7;
    const double pi = acos(-1.0);
    const int MAXN = 10000 + 10;
    const int MAXT = 10000 + 10;
    using namespace std;
    int a[10];
    vector<int> v;
    int tot;
    int judge(int id){
        int len = v.size();
        int sum = 0;
        for(int i = 0; i < len; ++i){
            sum += a[v[i]];
        }
        if(id == 0){
            if(sum % 1024 != 0) return -1;
        }
        if((tot - sum) % 1024 == 0 && (tot - sum) != 0){
            return 1024;
        }
        return (tot - sum) % 1024;
    }
    int solve(int n, int len, int id){
        int ans = -1;
        for(int i = 0; i < (1 << n); ++i){
            v.clear();
            for(int j = 0; j < n; ++j){
                if(i & (1 << j)){
                    v.push_back(j);
                }
            }
            if(v.size() == len){
                ans = max(ans, judge(id));
            }
        }
        return ans;
    }
    int main(){
        int n;
        while(scanf("%d", &n) == 1){
            tot = 0;
            for(int i = 0; i < n; ++i){
                scanf("%d", &a[i]);
                tot += a[i];
            }
            if(n <= 3){
                printf("1024
    ");
                continue;
            }
            int ans = 0;
            if(n == 4){
                ans = solve(n, 3, 0);
                if(ans != -1) ans = 1024;
                else{
                    ans = solve(n, 2, 1);
                }
            }
            else if(n == 5){
                ans = solve(n, 3, 0);
                if(ans == -1) ans = 0;
            }
            printf("%d
    ", ans);
        }
        return 0;
    }
    

      

  • 相关阅读:
    前端工程师需要的技能
    微信小程序
    前端问题总结
    vue面试题
    vue 双数据绑定原理
    路由配置5步
    chrome浏览器自动填充失效问题
    spring 登录提示 Bad credentials
    spring 项目tomcat 8.0.2 发布报错:Could not initialize class org.hibernate.validator.engine.ConfigurationImpl
    spring tiles界面为空白
  • 原文地址:https://www.cnblogs.com/tyty-Somnuspoppy/p/7232785.html
Copyright © 2020-2023  润新知