您的位置:首页 > 其它

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);}}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp 状态压缩