Doing Homework

HDOJ-1074

1.本题主要用的是状态压缩的方法,将每种状态用二进制压缩表示

2.状态转移方程:dp[i|(1<<j)]=min(dp[i|(1<<j)],dp[i]+max(0,total+homework[j].time-homework[j].deadline))

3.dp[i]表示i状态下时,所需要扣除的最少分数,total表示要到达i状态下,所用的所有时间。

4.本题还需要使用一个pre数组,用来记录路径。

5.这里还涉及到很多的二进制运算,特别需要注意多使用括号,因为有运算顺序的限制

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
const int INF=0x3f3f3f3f;
int n;
struct node{
int deadline;
int time;
string s;
};
node homework[16];
int dp[1<<16];//dp[i]表示i状态下需要扣除的最小分。
int pre[1<<16];//用来记录父节点。
void print(int ans){//递归打印出路径
if(ans==0)
return;
int es;
for(int i=0;i<n;i++){
if((ans&(1<<i))!=0&&(pre[ans]&(1<<i))==0){//找出属于该状态下但不属于上一个状态的结点
es=i;
break;
}
}
print(pre[ans]);
cout<<homework[es].s<<endl;
}
int main(){
int t;
cin>>t;
while(t--){
cin>>n;
string s;
int deadline,time;
for(int i=0;i<n;i++){
cin>>s>>deadline>>time;
homework[i].s=s;homework[i].deadline=deadline;homework[i].time=time;
}
memset(dp,INF,sizeof(dp));
memset(pre,0,sizeof(pre));
dp[0]=0;
int total=0;
for(int i=0;i<(1<<n);i++){
total=0;
for(int j=0;j<n;j++){
if(i&(1<<j))
total+=homework[i].time;
}
for(int j=0;j<n;j++){
if((i&(1<<j))==0){//注意这里需要加括号
if(dp[i|(1<<j)]>dp[i]+max(0,total+homework[j].time-homework[i].deadline)){//注意这里不能等于,因为要按照字典序的顺序输出,所以避免了这个问题
dp[i|(1<<j)]=dp[i]+max(0,total+homework[j].time-homework[i].deadline);
pre[i|(1<<j)]=i;//记录父节点
}
}
}
//cout<<dp[i]<<endl;
}
cout<<dp[(1<<n)-1]<<endl;
print((1<<n)-1);
}
//system("pause");
return 0;
}

HDOJ-1074(动态规划+状态压缩)的更多相关文章

  1. [动态规划]状态压缩DP小结

     1.小技巧 枚举集合S的子集:for(int i = S; i > 0; i=(i-1)&S) 枚举包含S的集合:for(int i = S; i < (1<<n); ...

  2. [POJ 2923] Relocation (动态规划 状态压缩)

    题目链接:http://poj.org/problem?id=2923 题目的大概意思是,有两辆车a和b,a车的最大承重为A,b车的最大承重为B.有n个家具需要从一个地方搬运到另一个地方,两辆车同时开 ...

  3. HDOJ 2167 Pebbles (状态压缩dp)

    题意:给你一个n*n的矩阵,让你从矩阵中选择一些数是的他们的和最大,规则是:相邻的两个数不能同时取,位置为(i,j)的数与(i+1,j),(i-1,j),(i,j+1),(i,j-1),(i+1,j+ ...

  4. POJ 1185 炮兵阵地(动态规划+状态压缩)

    炮兵阵地 Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原( ...

  5. HDU 1074 (DP + 状态压缩)

    题意: 给你N个课程, 每个课程有结束的时间 , 和完成这门课程需要的时间 超过课程结束ed时间,每一天就要花费 1点绩点: 然后要求你安排如何做课程使得花费的绩点最少 (看了博客后才发现状态压缩很⑥ ...

  6. ACM学习历程—HDU1584 蜘蛛牌(动态规划 && 状态压缩 || 区间DP)

    Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起 ...

  7. [ZOJ 3662] Math Magic (动态规划+状态压缩)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3662 之前写过这道题,结果被康神吐槽说代码写的挫. 的确,那时候 ...

  8. HDOJ 2442 -bricks 状态压缩DP 一直TLE.打表过的..

    有5个砖块..加上一个空着不放..那么有6种状态..所以很明显的可以用6进制的状态DP... 不过这么做..我觉得我已经能优化的都优化了...还是超时..一看数据范围是100*6..打表先AC了.. ...

  9. 动态规划状态压缩-poj1143

    题目链接:http://poj.org/problem?id=1143 题目描述: 代码实现: #include <iostream> #include <string.h> ...

随机推荐

  1. zoj3777 Problem Arrangement(状压dp,思路赞)

    The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem setter, Edward i ...

  2. 牛客编程巅峰赛S2第3场 Tree VI (树,dfs)

    题意:给你一个\(n\)个点的完全\(k\)叉树的先序遍历序列\(a\),还原这颗树并且求所有两个端点的异或和. 题解:用dfs在还原树的时候,把子节点和父亲节点的异或贡献给答案,对于每个节点,我们找 ...

  3. hdu5247 找连续数

    Problem Description 小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是否能找到一个k 的区间,里面的 k 个数字排完序后是连续的. 现在小度熊增加题目难度,他不想知道是否有这 ...

  4. 二、Python基础(input、变量名、条件语句、循环语句、注释)

    一.input用法 input在Python中的含义为永远等待,直到用户输入了值,从而将所输入的值赋值另外的一个东西. n=input('请输入......') 接下来用一个例子学习input的用法 ...

  5. K8S(12)配置中心实战-多环境交付apollo三组件

    k8s配置中心实战-多环境交付apollo三组件 目录 k8s配置中心实战-多环境交付apollo三组件 1.环境准备工作 1.1 zk环境拆分 1.2 namespace分环境 1.3 数据库拆分 ...

  6. spring再学习之AOP实操

    一.spring导包 2.目标对象 public class UserServiceImpl implements UserService { @Override public void save() ...

  7. 基于Vue的单页面应用的Markdown渲染

    之前渲染 Markdown 的时候, 笔者使用的是 mavonEditor 的预览模式, 使用起来比较爽, 只需要引入组件即可, 但是在最近的开发中, 遇到了困难. 主要问题在于作为单页面应用, 站内 ...

  8. 数位dp【模板 + 老年康复】

    学习博客: 戳这里 戳这里 "在信息学竞赛中,有这样一类问题:求给定区间中,满足给定条件的某个D 进制数或此类数的数量.所求的限定条件往往与数位有关,例如数位之和.指定数码个数.数的大小顺序 ...

  9. Swift Playground All In One

    Swift Playground All In One Swift 5.3 Playgrounds in Xcode Xcode 11.5 https://developer.apple.com/vi ...

  10. Git Best Practice All In One

    Git Best Practice All In One git workflow 本地开发环境: 开发人员自测的,可以是自己本地部署的静态服务器,当然也可类似是运行 npm server类似的环境, ...