题目链接:https://cn.vjudge.net/contest/68966#problem/D

具体思路:我们可以把每个情况都枚举出来,然后用递归的形式求出最终的情况.

比如说 我们要求  10101 的扣分最小值,我们可以把 10100和00101和10001这三种 情况加上 对应的课的时候的最小值,具体解释看代码

(再理解一下,对于这个公式tmp[i]=tmp[i^(1<<j)]+max(sum-d[j],0)

我们之前求的是总的花费的时间,然后如果一门课的截止时间小于这个总的时间花费,也就是说这是要被扣分的没我们是要懂这些被扣分的情况中选取一个扣分最小的情况选出来.(等于的时候也需要考虑,因为有可能相等的时候有的路的花费是不同的)

AC代码:

#include<bits/stdc++.h>
using namespace std;
# define ll long long
const int maxn = 50000+100;
# define inf 0x3f3f3f3f
const int mod = 1e9;
struct node
{
string str;
int st;
int con;
} q[maxn];
int dp[maxn],pre1[maxn],pre2[maxn];
vector<int>vis;
int main()
{
ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--)
{
vis.clear();
memset(dp,inf,sizeof(dp));
memset(pre1,0,sizeof(pre1));
memset(pre2,0,sizeof(pre2));
int n;
cin>>n;
dp[0]=0;
for(int i=0; i<n; i++)
{
cin>>q[i].str>>q[i].st>>q[i].con;
}
int maxstate=(1<<n)-1;
for(int i=1; i<=maxstate; i++)
{
int sum=0;
int tmp;
for(int j=0; j<n; j++)
{
if((1<<j)&i)sum+=q[j].con;;//所需要的时间
}
for(int j=0; j<n; j++)
{
if((1<<j)&i)
{
tmp=dp[i^(1<<j)]+max(sum-q[j].st,0);//这个公式的具体含义,我们要求的是加上最后一门课的最优情况,所以我们可以把所有的时间都加上,然后在计算一下新加入的这门课的截止时间,最后求一下差就可以了
if(tmp<=dp[i])
{
dp[i]=tmp;
pre1[i]=j;
pre2[i]=((1<<j)^i);
}
}
}
}
cout<<dp[maxstate]<<endl;
for(int i=maxstate; i>=1; i=pre2[i])
{
// cout<<q[pre1[i]].str<<endl;
vis.push_back(pre1[i]);
}
int len=vis.size();
for(int i=len-1; i>=0; i--)
{
cout<<q[vis[i]].str<<endl;
}
}
return 0;
}

D - Doing Homework HDU - 1074 (状压dp)的更多相关文章

  1. Doing Homework HDU - 1074 (状压dp)

    Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every ...

  2. Doing Homework(HDU 1074状压dp)

    题意:给你n个要做的作业,它们的名字.期限.可完成所需天数(必须连续)在规定期限不能完成要扣分(每天一分)求做作业顺序使扣分最少. 分析:作业数量较少,用状态压缩,做到第i种作业花费的天数dp[i]. ...

  3. HDU 1074状压DP

    Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  4. hdu 1074 (状压dp)

    题意: 给出几个学科的作业.每个作业剩余的时间.完成每个学科作业的时间.如果在剩余时间内不能完成相应作业 就要扣分 延迟一天扣一分 求最小扣分 解析: 把这些作业进行全排列  求出最小扣分即可 但A( ...

  5. HDU 4778 状压DP

    一看就是状压,由于是类似博弈的游戏.游戏里的两人都是绝对聪明,那么先手的选择是能够确定最终局面的. 实际上是枚举最终局面情况,0代表是被Bob拿走的,1为Alice拿走的,当时Alice拿走且满足变换 ...

  6. HDU 3001 状压DP

    有道状压题用了搜索被队友骂还能不能好好训练了,, hdu 3001 经典的状压dp 大概题意..有n个城市 m个道路  成了一个有向图.n<=10: 然后这个人想去旅行.有个超人开始可以把他扔到 ...

  7. hdu 2809(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2809 思路:简单的状压dp,看代码会更明白. #include<iostream> #in ...

  8. hdu 2167(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2167 思路:经典的状压dp题,前后,上下,对角8个位置不能取,状态压缩枚举即可所有情况,递推关系是为d ...

  9. Engineer Assignment HDU - 6006 状压dp

    http://acm.split.hdu.edu.cn/showproblem.php?pid=6006 比赛的时候写了一个暴力,存暴力,过了,还46ms 那个暴力的思路是,预处理can[i][j]表 ...

随机推荐

  1. ansible部署(pip安装)

    centos7 pip安装 ansible 首先ansible基于python2.X 环境 默认centos都已经安装好了python2环境 安装可选性 ansible可以通过源码,yum,pip等方 ...

  2. Jmeter—添加断言 判断接口响应数据是否符合预期

    发出请求之后,通过添加断言可以判断响应数据是否是我们的预期结果. 1 在Jmeter中发送一个状态返回200的http请求(参数故意输入错误).结果肯定是不是返回200啦. 但结果树中http请求的图 ...

  3. 整理:python的二维数组操作

    Python中初始化一个5 x 3每项为0的数组,最好方法是: multilist = [[0 for col in range(5)] for row in range(3)] 如果初始化一个二维数 ...

  4. MT【134】待定系数

    已知\(a,b>0\)且\(ab(a+b)=4\),求\(2a+b\)的最小值______. 解答:\(\sqrt{3}(2a+b)\ge(\sqrt{3}+1)a+b+(\sqrt{3}-1) ...

  5. 【刷题】LOJ 6000 「网络流 24 题」搭配飞行员

    题目描述 飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员.由于种种原因,例如相互配合的问题,有些驾驶员不能在同一架飞机上飞行,问如何搭 ...

  6. 【洛谷4005】小Y和地铁(搜索)

    [洛谷4005]小Y和地铁(搜索) 题面 洛谷 有点长. 题解 首先对于需要被链接的两个点,样例中间基本上把所有的情况都给出来了. 但是还缺了一种从下面绕道左边在从整个上面跨过去在从右边绕到下面来的情 ...

  7. 【IOI 2018】Highway 高速公路收费

    这是一道极好的图论题,虽然我一开始只会做$18$分,后来会做$51$分,看着题解想了好久才会做(吐槽官方题解:永远只有一句话),但这的确是一道好题,值得思考,也能启发思维. 如果要讲这道题,还是要从部 ...

  8. 2018.9.20 Educational Codeforces Round 51

    蒟蒻就切了四道水题,然后EF看着可写然而并不会,中间还WA了一次,我太菜了.jpg =.= A.Vasya And Password 一开始看着有点虚没敢立刻写,后来写完第二题发现可以暴力讨论,因为保 ...

  9. python之旅:函数基础

    一.引子 1.函数是什么 用函数与不用函数 #1.代码的组织结构不清晰,可读性差 #2.遇到重复的功能只能重复编写实现代码,代码冗余 #3.功能需要扩展时,需要找出所有实现该功能的地方修改之,无法统一 ...

  10. Python完成RF测试用例

    Robot Framework 框架是基于 Python 语言开发的,所以,它本质上是 Python 的一个库. from robot.api import TestSuite from robot. ...