hdu 1074 状态压缩dp
来源:互联网 发布:淘宝助理有客服吗 编辑:程序博客网 时间:2024/06/02 23:16
题目描述:有 n 门课程的作业,每门都有完成期限D,与完成所需时间C,若超过期限,1天扣1分。
问完成这n门作业至少要扣多少分,并输出扣分最少的做作业顺序。
思路:
dp[i]记录完成状态为i的情况下的信息。(完成所需时间,上一个状态,最小扣分)
状态方程:dp[i] = min(dp[j]+cost(j,i)) (从j状态能到i状态)
code:
#include <iostream>#include <cstdio>#include <cmath>#include <string>#include <algorithm>#include <cstring>#include <queue>#include <iomanip>#include <set>#include <vector>using namespace std;typedef long long LL;#define inf 0x3f3f3f3f#define M 1<<15struct node{ int cost;//完成所需时间 int sub;//最小扣分 int pre;//上一个状态}dp[M];struct course{ char name[105]; int dead,need;}c[16];void print(int s)//递归打印解{ int job=s^dp[s].pre; int id=0; while(job) { id++; job>>=1; } id--; if(dp[s].pre) print(dp[s].pre); printf("%s\n",c[id].name);}int main(){ int t; int n,i,j; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=0;i<n;i++) scanf("%s%d%d",c[i].name,&c[i].dead,&c[i].need); dp[0].cost=0; dp[0].pre=-1; dp[0].sub=0; int tot=(1<<n)-1; for(i=1;i<=tot;i++)//所有状态 { dp[i].sub=inf; for(j=n-1;j>=0;j--) { if(i&(1<<j)) { int last=i^(1<<j),tem; tem=dp[last].sub; if(dp[last].cost+c[j].need>c[j].dead)//超过期限 tem=dp[last].sub+dp[last].cost+c[j].need-c[j].dead; else tem=dp[last].sub; if(tem<dp[i].sub) { dp[i].pre=last; dp[i].sub=tem; dp[i].cost=dp[last].cost+c[j].need; } } } } printf("%d\n",dp[tot].sub); print(tot); } return 0;}
0 0
- HDU 1074 状态压缩DP
- HDU 1074 状态压缩dp
- HDU 1074 (状态压缩DP)
- hdu 1074 状态压缩dp
- HDU 1074 状态压缩dp
- HDU 1074(状态压缩dp)
- hdu 1074 状态压缩dp
- hdu 1074(状态压缩dp)
- hdu 1074 状态压缩dp
- HDU-1074-状态压缩DP
- HDU 1074 状态压缩dp
- [状态压缩DP] HDU 1074
- 【状态压缩dp】HDU
- hdu 1074 DFS+状态压缩DP
- hdu 1074 Doing Homework(dp+状态压缩)
- HDU 1074 Doing Homework (状态压缩DP)
- hdu 1074 DP 二进制状态压缩
- hdu 1074 Doing Homework (状态压缩 + DP)
- jquery解析后台传的json数据
- Java中的泛型方法
- 扒一扒这个数据挖掘行业,黄油和面包
- ubuntu 下安装source insight
- 继承?静态代理?写一个自己的动态代理吧
- hdu 1074 状态压缩dp
- 粥中有道,读书笔记
- 微信公众平台通知插件,网店必备客户服务工具
- linux下安装mysql
- Socket通信原理
- time类
- 南阳理工OJ_题目891 找点
- nyoj119(RMQ算法+线段树)
- Cloud Chou's Tech Blog编译相关