题目链接: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. Xwork概况 XWork是一个标准的Command模式实现,并且完全从web层脱离出来。Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL – the Object Graph NavigationLanguage),IoC(Inversion of Control反转控制)容器等。 ----------------

    Xwork概况 XWork是一个标准的Command模式实现,并且完全从web层脱离出来.Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式 ...

  2. tensorflow环境下安装scikit-learn

    1. scikit-learn所依赖的环境: python(>=2.6 or >=3.3) numpy(>=1.6.1) scipy(>=0.9) 可用conda list 查 ...

  3. 关于OpenGL游戏全屏模式的设置

    使用DirectX的API的话可以给游戏窗口设置指定的显示器和全屏独占模式,但是如果使用OpenGL的API就比较遗憾不能直接设置. 以下内容基于Windows系统. 如果使用OpenGL渲染,第一步 ...

  4. SQLServer 重建索引前后对比 (转)

    https://www.cnblogs.com/mingl12/p/5730178.html

  5. Candies CodeForces - 991C(二分水题)

    就是二分暴力就好了 为什么要记下来 呵呵....emm你说为什么... 行吧 好吧 我一直以为我的二分出问题了 原来不是 依旧很帅 统计的时候求的减了多少次  然后用次数乘了mid 这样做会使那个人获 ...

  6. phpredis -- redis_cluster

    https://github.com/phpredis/phpredis/tree/feature/redis_cluster https://github.com/phpredis/phpredis

  7. Luogu 1063 能量项链(动态规划)

    Luogu 1063 能量项链(动态规划) Description 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某 ...

  8. git "refusing to merge unrelated histories" 解决方法

    出现这个错误是因为本地的 git 历史和远程仓库的 git 历史不一样,如果我们想要合并两个不同的 git 历史(我们必须要清楚我们在做什么),就可以使用这个选项来进行强制合并不同的 git 历史,如 ...

  9. Visual Studio 2013打开项目出现“未安装项目的目标框架”提示

    问题描述: windows 10 系统里用Visual Studio 2013打开项目,提示如下: 说项目的.NET Framework version=v4.5,系统里没装,让将项目的框架从v4.5 ...

  10. python基础4--文件操作

    文件操作 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 1.open()打开文件 #获取文件句柄 f = open("yesterday" ...