hud 1074 Doing Homework(经典dp)
2016-07-11 10:10
197 查看
<span style="font-family:Microsoft YaHei;font-size:18px;">最近在刷简单dp,弱菜一枚~ 对于dp的状态方程还是不能很好的理解。 多做题吧</span>
#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int maxn = (1<<15)+10;const int inf = 0x3f3f3f3f;int dp[maxn],times[maxn],path[maxn];struct ss {char name[100];int deadline,time;} a[20];int Max(int x,int y) {if(x > y)return x;elsereturn y;}void output(int x) {if(!x) return ;output(x - (1<<path[x]));printf("%s\n",a[path[x]].name);}int main() {int t,n;scanf("%d",&t);while(t--) {scanf("%d",&n);for(int i = 0;i < n;i++)scanf("%s%d%d",a[i].name,&a[i].deadline,&a[i].time);memset(times,0,sizeof(times));//memset(dp,0,sizeof(dp));for(int i = 1;i < (1<<n);i++) {//递推每个状态dp[i] = inf;for(int j = n-1;j>=0;j--) {//比较每门课放在最后面交的结果,将最优结果存入dp[i]int temp = 1<<j;if(!(i&temp)) continue;int cc = times[i-temp] + a[j].time - a[j].deadline;cc = Max(cc,0);if(dp[i-temp] + cc < dp[i]) {dp[i] = dp[i-temp] + cc;times[i] = times[i-temp] + a[j].time;//更新最优解时的时间path[i] = j;//更新最优解时的课程顺序}}}printf("%d\n",dp[(1<<n)-1]);output((1<<n)-1);}}
相关文章推荐
- 详解Android应用中屏幕尺寸的获取及dp和px值的转换
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android dpi,dip,dp的概念以及屏幕适配
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- 01背包问题