题目链接: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. 3 vue-router 的默认hash 改mode:history去除#号 传参

    npm install vue-router --save      //安装 传参

  2. Java并发编程之线程安全、线程通信

    Java多线程开发中最重要的一点就是线程安全的实现了.所谓Java线程安全,可以简单理解为当多个线程访问同一个共享资源时产生的数据不一致问题.为此,Java提供了一系列方法来解决线程安全问题. syn ...

  3. 第217天:深入理解Angular双向数据绑定的原理

    一.理解angular双向数据绑定 双向绑定是新的前端框架中频繁出现的一个新词汇,也是mvvm的核心原理.angularjs五条核心信念中的数据驱动,便是由双向绑定进行完成. 那么什么是双向绑定,下面 ...

  4. API接口测试中需要注意的地方

    1.检查接口返回的数据是否与预期结果一致. 2.检查接口的容错性,假如传递数据的类型错误时是否可以处理.例如是支持整数,传递的是小数或字符串呢? 3.接口参数的边界值.例如,传递的参数足够大或为负数时 ...

  5. 【BZOJ4025】二分图(线段树分治,并查集)

    [BZOJ4025]二分图(线段树分治,并查集) 题面 BZOJ 题解 是一个二分图,等价于不存在奇环. 那么直接线段树分治,用并查集维护到达根节点的距离,只计算就好了. #include<io ...

  6. BZOJ 2724 蒲公英 | 分块模板题

    题意 给出一个序列,在线询问区间众数.如果众数有多个,输出最小的那个. 题解 这是一道分块模板题. 一个询问的区间的众数,可能是中间"整块"区间的众数,也可能是左右两侧零散的数中的 ...

  7. POJ 3348 Cows | 凸包——童年的回忆(误)

    想当年--还是邱神给我讲的凸包来着-- #include <cstdio> #include <cstring> #include <cmath> #include ...

  8. Hbase—— rowkey 过滤器(rowfilter)

    1.RowFilter 提取rowkey以01结尾数据Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,new RegexStri ...

  9. python之旅:常用模块

    一.time与datetime模块 在Python中,通常有这几种方式来表示时间 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1号00:00:00开始按照秒计算的偏移量.我们 ...

  10. linux expect 的使用

    expect 可以让一些需要交互的命令自动完成,如 ssh 连接的适合需要输入密码. 也就是说,某些重复的操作我们可以使用该命令完成,比如 ssh 连接到服务器,然后进到某个项目目录,进行 git 的 ...