CSP-按位、移位运算专讲和状压DP(HDU-1074)

CSP-状压DP和经典作业问题

题目概述

马上假期就要结束了,zjm还有 n 个作业,完成某个作业需要一定的时间,而且每个作业有一个截止时间,若超过截止时间,一天就要扣一分。
zjm想知道如何安排做作业,使得扣的分数最少。
Tips: 如果开始做某个作业,就必须把这个作业做完了,才能做下一个作业。

Input和输入样例

有多组测试数据。第一行一个整数表示测试数据的组数
第一行一个整数 n(1<=n<=15)
接下来n行,每行一个字符串(长度不超过100) S 表示任务的名称和两个整数 D 和 C,分别表示任务的截止时间和完成任务需要的天数。
这 n 个任务是按照字符串的字典序从小到大给出。
输入样例:

2
3
Computer 3 3
English 20 1
Math 3 2
3
Computer 3 3
English 6 3
Math 6 3

Output和输出样例

每组测试数据,输出最少扣的分数,并输出完成作业的方案,如果有多个方案,输出字典序最小的一个。
输出样例:

2
Computer
Math
English
3
Computer
English
Math

按位运算和移位运算

在叙述状压DP,之前有必要说明C语言位运算中几种常用的判断和运算方法。因为不是所有人都经常使用移位运算和按位运算,先回顾一下这两种运算:
1、移位运算(以左移为例)
将给出的数字进行逻辑移位(二进制),因此每次移位低位补零,数字扩大一倍,从计算机底层原理来看移位过程时这样的:

1
10
100
1000
10000
100000
1000000

2、按位运算
按位与运算(&):
从高位到低位按位进行与运算,如果全为1,则为1,否则为0。
两种用途:
1、置零,将任何一个数和全0按位与运算,将该数清零。
2、确定指定位置上是否有数字:指定位置置1,其余置零。将原数和该数按位与,如果结果大于零则该位置上有数字。
例子:

原数:10010111
要找到第3位上是否有数字
构造的数字:100
按位与结果:00000100>0
结论:3位置上有数字

按位或运算(|):
从高位到低位按位进行或预算,如果有1,则结果为1,全0则为0。
用途:
在指定位置上置1:如果需要在某个数字的某个位置上置1,可以构造数字:置1的位置上为1,其余位置为零,将构造后的数字和原数字按位或运算。
例子:

原数:10000001
要在第45位上置1
构造的数字:11000
按位与结果:10011001
结论:45位置上成功置为了1

按位异或运算(^):
从高位到低位按位进行异或预算,相同为0,不同为1。
重要性质:某个数和0异或保持原值不变,和1异或则各位取反。
用途:
在指定位置上翻转:如果需要在某个位置上翻转,其余部分不变,可以构造数字:翻转的位置上为1,不变的位置上为0,与原数按位异或即可。

原数10011001
要在4位置上翻转
构造的数字1000
按位异或的结果:10010001
结论:4位的值完成翻转,且其余各位保持不变

实际使用:
如果S是一个01序列,每个位置上的0/1表示该位置上是否被选择,那么有如下几个位运算规则:
1、判断第 i 位是否选择:

if(S & (1<<i)) return true;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值