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. gym101002K. Inversions (FFT)

    题意:给定一个仅含有AB的字母串 如果i有一个B j有一个A 且j>i 会对F(j-i)产生贡献 求出所有发Fi 题解:好像是很裸的FFT B的分布可以看作一个多项式 同理A也可以 然后把B的位 ...

  2. Educational Codeforces Round 88 (Rated for Div. 2) E. Modular Stability(数论)

    题目链接:https://codeforces.com/contest/1359/problem/E 题意 有一大小为 $k$ 的数组,每个元素的值在 $[1,n]$ 间,若元素间两两不等,问有多少数 ...

  3. hdu2669Romantic (扩展欧几里德)

    Problem Description The Sky is Sprite. The Birds is Fly in the Sky. The Wind is Wonderful. Blew Thro ...

  4. Educational Codeforces Round 89 (Rated for Div. 2) C. Palindromic Paths (思维)

    题意:有一个\(n\)x\(m\)的矩阵,从\((1,1)\)出发走到\((n,m)\),问最少修改多少个数,使得所有路径上的数对应相等(e.g:\((1,2)\)和\((n-1,m)\)或\((2, ...

  5. 【cpp上】课后正误小题

    State whether each of the following is true or false. If false, explain why. Assume the state ment u ...

  6. Monorepo All In One

    Monorepo All In One monorepos 只是一种思想,或设计模式,架构风格 https://trunkbaseddevelopment.com/monorepos/ Lerna h ...

  7. soft tab

    soft tab hard-tabs 是硬件 tab,就是按一个 tab 键; soft-tabs 是软件 tab,通过按 4个 space 键实现; refs Tabs vs. Spaces, FR ...

  8. CSS 设置多行文本省略号 ...

    CSS 设置多行文本省略号 ... .box{ display: -webkit-box; overflow: hidden; text-overflow: ellipsis; word-wrap: ...

  9. http cache & 浏览器缓存,存储位置的优先级,条件?

    http cache & 浏览器缓存,存储位置的优先级,条件? memory cache disk cache 浏览器缓存,存储位置的优先级,条件, 机制,原理是什么? from memory ...

  10. NGK公链助力医疗行业数据安全

    近年来医疗领域的数据泄露事件时有发生,医疗行业数据面临着医疗数据获得不易及缺乏有效管理和数据安全机制问题.而区块链的去中心化.分布式账本等特点正好契合医疗领域的需求点. 医疗数据市场痛点 一.医疗信息 ...