zoukankan      html  css  js  c++  java
  • 【bzoj2073】[POI2004]PRZ 状态压缩dp

    题目描述

    一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍在桥上的人都不能超过一定的限制. 所以这只队伍过桥时只能分批过,当一组全部过去时,下一组才能接着过. 队伍里每个人过桥都需要特定的时间,当一批队员过桥时时间应该算走得最慢的那一个,每个人也有特定的重量,我们想知道如何分批过桥能使总时间最少.

    输入

    第一行两个数: w – 桥能承受的最大重量(100 <= w <= 400) 和 n – 队员总数(1 <= n <= 16). 接下来n 行每行两个数分别表示: t – 该队员过桥所需时间(1 <= t <= 50) 和 w – 该队员的重量(10 <= w <= 100).

    输出

    输出一个数表示最少的过桥时间.

    样例输入

    100 3
    24 60
    10 40
    18 50

    样例输出

    42


    题解

    枚举子集的状态压缩dp

    先预处理一下time和sum数组,然后枚举子集即可。

    题解中数组下标从0开始,如果从1开始请注意细节。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int f[65540] , tim[65540] , sum[65540] , t[17] , w[17];
    int main()
    {
        int m , n , i , j;
        scanf("%d%d" , &m , &n);
        for(i = 0 ; i < n ; i ++ )
            scanf("%d%d" , &t[i] , &w[i]);
        memset(f , 0x3f , sizeof(f));
        f[0] = 0;
        for(i = 0 ; i < (1 << n) ; i ++ )
            for(j = 0 ; j < n ; j ++ )
                if((1 << j) & i)
                    tim[i] = max(tim[i] , t[j]) , sum[i] += w[j];
        for(i = 0 ; i < (1 << n) ; i ++ )
            for(j = i ; j ; j = i & (j - 1))
                if(sum[j] <= m)
                    f[i] = min(f[i] , f[i ^ j] + tim[j]);
        printf("%d
    " , f[(1 << n) - 1]);
        return 0;
    }
  • 相关阅读:
    时间等待太重要!!!
    (引用 )自动化测试报告HTMLtestrunner
    (转载)selenium-webdriver(python)
    lr_convert_string_encoding()转码函数
    分步骤学习自动化测试
    (引用)web安全测试
    Monkey测试
    (学习网址)Python 自动化测试
    (引用) unittest测试驱动之执行测试(三)
    log4net日志组件
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/6212518.html
Copyright © 2011-2022 走看看