ZOJ 1639 Hang Up the System (状态压缩)

Hang Up the System


Time Limit: 2 Seconds      Memory Limit: 32768 KB


You‘re going to design a multi-task operating system for an embedded system. Because the resources are limited on this mini computer, parallel running of some programs will probably
give rise to the deadlock problem. According to experience, you have a list of programs that will hang up the system if all of them are running simultaneously. You are also given the priority of these programs. Now you‘re interested in the maximum value of
the total priority of the programs that can run simultaneously in the system without hanging up.

Input

The input has several test cases, each starts with n (2 <= n <= 16), the number of programs. The following n lines contain the name of the program and its priority, with each program
on a line. The name is a string of no more than 10 characters. The priority is an integer from 1 to 100. The next line contains a single integer m (0 <= m <= 1,024), which is the length of the list of the conflicting programs. The following m lines each contains
several names of the programs which cannot run together.

The input is terminated with a case n = 0. This case should not be processed.

Output

Print the case number and the maximal total priority value you can get on a line. Adhere to the sample output format.

Sample Input

3
HARDDISK 20
FLOPPY 10
CDROM 15
1
CDROM HARDDISK
5
HARDDISK 20
FLOPPY 10
CDROM 15
SERIAL 25
MOUSE 20
3
CDROM HARDDISK FLOPPY
FLOPPY SERIAL
SERIAL MOUSE
0

Sample Output

System 1: 30
System 2: 60

题意:先给出n个任务和每个任务的价值,然后给出m个限制条件,每个限制条件包括一些任务,说明这些任务不能同时进行处理。求能同时处理的任务的最大价值是多少。

分析:因为n不大于16,而且限制条件也比较少,所以很容易想到状态压缩。

先把那些限制条件转化为一个10进制整数,它的二进制形式中的1表示这些任务不能同时处理;然后从0开始枚举状态,判断当前状态与限制条件是否冲突,如果不冲突,算出当前状态的价值总和,与最大值进行比较即可。

注意:任务的名称不一定全是字母,可能由其他字符组成,我就是因为这里WA了还找不到错误。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<cstdlib>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<algorithm>
using namespace std;
typedef long long LL;

map<string, int> mp;
vector<int> v[1030];
int a[30];
int sta[1030];
int pro[17] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536};

int main()
{
    int n, m, i, j, cas = 0;
    string str, tmp;
    int val;
    while(cin >> n && n)
    {
        mp.clear();
        for(i = 1; i <= n; i++)
        {
            cin >> str >> val;
            mp[str] = i;
            a[i] = val;
        }
        memset(v, 0, sizeof(v));
        memset(sta, 0, sizeof(sta));
        cin >> m;
        getchar();
        for(int k = 0; k < m; k++)
        {
            getline(cin, str);
            int len = str.length();
            tmp = "";
            for(i = 0; i < len; i++)
            {
                if(str[i] != ' ' && str[i] != '\0') //注意此处的判断条件
                    tmp += str[i];
                else
                {
                    v[k].push_back(mp[tmp]);
                    tmp = "";
                }
            }
            v[k].push_back(mp[tmp]);
            sort(v[k].begin(), v[k].end());
            for(int j = 0; j < v[k].size(); j++)
                sta[k] += pro[n-v[k][j]];
        }
        int maxn = 1;
        for(i = 1; i <= n; i++)
            maxn *= 2;
        int ans = 0;
        for(int i = 0; i < maxn; i++)
        {
            int flag = 1;
            for(j = 0; j < m; j++)
            {
                if((i & sta[j]) == sta[j])
                {
                    flag = 0;
                    break;
                }
            }
            if(flag)
            {
                int tmp_sum = 0;
                int tt = 0, temp = i;
                while(temp)
                {
                    if(temp % 2 == 1)
                        tmp_sum += a[n-tt];
                    tt++;
                    temp /= 2;
                }
                ans = max(ans, tmp_sum);
            }
        }
        printf("System %d: %d\n", ++cas, ans);
    }
    return 0;
}

ZOJ 1639 Hang Up the System (状态压缩)

时间: 2024-10-21 04:17:59

ZOJ 1639 Hang Up the System (状态压缩)的相关文章

ZOJ 3802 Easy 2048 Again ( 状态压缩 )

题目链接~~> 做题感悟:这题很经典 ,需要模拟一下找规律,还是那句话遇到题自己应该手动推一下. 解题思路: 这题如果手动推几组数据的话就应该发现 ,如果放进队列的元素是递减的话,这样才可以连续合并,如果队列中有 a  ,b , a < b 那么 a 前面的必定不会与 b 经过合并再合并,因为越合并越大,so ~> 队列中最多才存 12 个数,可以用状态压缩压缩一下.注意要用滚动数组,不用可能超时. 代码: #include<iostream> #include<sst

POJ 3254 Corn Fields 状态压缩DP (C++/Java)

http://poj.org/problem?id=3254 题目大意: 一个农民有n行m列的地方,每个格子用1代表可以种草地,而0不可以.放牛只能在有草地的,但是相邻的草地不能同时放牛, 问总共有多少种方法. 思路: 状态压缩的DP. 可以用二进制数字来表示放牧情况并判断该状态是否满足条件. 这题的限制条件有两个: 1.草地限制. 2.相邻限制. 对于草地限制,因为输入的时候1是可以种草地的. 以"11110"草地分析,就只有最后一个是不可以种草的.取反后得00001  .(为啥取反

奇妙的算法—状态压缩动态规划

华电北风吹 天津大学认知计算与应用重点实验室 日期:2015/8/27 由于代码未调试完全正确论文草稿呈现 poj上一道需要用到状态压缩动态规划,链接http://poj.org/problem?id=3254 网上看到有很多人写出了代码,参考了一个带备忘的自顶向下的动态规划解法,自己写了一个有底向上的动态规划解法 有底向上: #include<iostream> #include<math.h> #include<ostream> #include<fstrea

ACM/ICPC 之 BFS+状态压缩(POJ1324(ZOJ1361))

求一条蛇到(1,1)的最短路长,题目不简单,状态较多,需要考虑状态压缩,ZOJ的数据似乎比POj弱一些 POJ1324(ZOJ1361)-Holedox Moving 题意:一条已知初始状态的蛇,求其到(1,1)的最短路长 题解:开始做的时候用BFS暴力做了一次,结果RE了,后来看了其他的题解和discuss才转向状态压缩.也看到有人用A*做出来了. 现在简要介绍一下状态压缩的思路: 由于蛇身最长只有8,可以利用两条相邻蛇身坐标确定其相对方向(四个方向),两位二进制可以表示 这样 一个蛇头坐标+

ZOJ3471 状态压缩DP

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3471 Recently, researchers on Mars have discovered N powerful atoms. All of them are different. These atoms have some properties. When two of these atoms collide, one of them disappears and

zoj2977Strange Billboard (状态压缩+枚举)

Strange Billboard Time Limit: 2 Seconds Memory Limit: 65536 KB The marketing and public-relations department of the Czech Technical University has designed a new reconfigurable mechanical Flip-Flop Bill-Board (FFBB). The billboard is a regular two-di

2014 Super Training #6 G Trim the Nails --状态压缩+BFS

原题: ZOJ 3675 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3675 由m<=20可知,可用一个二进制数表示指甲的状态,最多2^20,初始状态为0,表示指甲都没剪,然后BFS找解,每次枚举剪刀的两个方向,枚举移动的位数进行扩展状态即可. 代码: #include <iostream> #include <cstdio> #include <cstring> #include &

POJ1185 炮兵阵地 状态压缩DP

B - 炮兵阵地 Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Appoint description:  System Crawler  (2014-06-29) Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用&quo

插头与轮廓线与基于连通性状态压缩的动态规划

问题定义 什么是插头DP 在一个n*m的棋盘上(n与m很小),求: 有多少种不同的回路数 用1条回路经过所有点的方案数 用1条回路经过部分点的方案数 1条路径上的权值和最大 的这一类问题,通常可以用插头DP来解决. 这类问题通常很明显,但代码量大又容易出错,有时TLE有时MLE. 什么是基于状态压缩的动态规划 基于状态压缩的动态规划问题是一类以集合信息为状态且状态总数为指数级的特殊的动态规划问题. 在状态压缩的基础上,有一类问题的状态中必须要记录若干个元素的连通情况,我们称这样的问题为基于连通性