HDU 1074 状压DP
2014-03-12 16:18
232 查看
状态压缩DP 模板
感觉叫 状态压缩搜索更合适。。。
感觉叫 状态压缩搜索更合适。。。
#include "iostream" #include "algorithm" const int inf=0x7fffffff; struct comp { char name[101]; int et,cost; } data[21]; int b[21],hash[21]; int sum[1<<16];// 存储代价 char out[21][101],str[21][101]; int n; void dp(int start,int cost,int num,int works)// 起始时间,代价,完成数,状态压缩值 { int i,temp; if (num==n) { if (cost==sum[works]) { for (i=0;i<n;i++) strcpy(out[i],str[i]); } return ; } for (i=1;i<=n;i++) if (hash[i]==0) { hash[i]=1; temp=start+data[i].cost-data[i].et; if (temp<0) temp=cost; else temp+=cost; works+=b[i]; if (sum[works]>temp) { sum[works]=temp; strcpy(str[num],data[i].name); num++; dp(start+data[i].cost,temp,num,works); num--; } hash[i]=0; works-=b[i]; } } int main() { int i,ans,t; b[0]=1; for (i=1;i<=16;i++) b[i]=b[i-1]<<1; scanf("%d",&t); while (t--) { scanf("%d",&n); for (i=1;i<=n;i++) scanf("%s%d%d",data[i].name,&data[i].et,&data[i].cost); memset(hash,0,sizeof(hash)); for (i=0;i<(1<<16);i++) sum[i]=inf; ans=0; for (i=1;i<=n;i++) ans+=b[i]; dp(0,0,0,0); printf("%d\n",sum[ans]); for (i=0;i<n;i++) printf("%s\n",out[i]); } return 0; }
相关文章推荐
- HDU 1074 Doing Homework(状压DP)
- HDU 1074 Doing Homework(状压DP输出路径)
- HDU 1074 Doing Homework(状压dp)
- hdu 1074 Doing Homework(状压DP)
- hdu_1074_Doing Homework(状压DP)
- HDU 1074 The Highest Mark(状压DP)
- 每日三题-Day2-A(HDU 1074 Doing Homework 状压DP)
- HDU 1074 Doing Homework (二进制状态压缩,状压dp)
- hdu 1074 Doing Homework(状压DP)
- 【HDU 1074 Doing Homework】+ 状压dp
- hdu-1074(状压dp)
- hdu 1074 Doing Homework(状压DP)
- HDU 1074 Doing Homework(状压DP)
- hdu 1074 Doing Homework(状压DP)
- HDU 1074 Doing Homework(状压DP)
- HDU-1074 Doing Homework( 状压DP )
- HDU 1074 Doing Homework(状压DP)
- HDU 1074 Doing Homework(状压dp)
- hdu 1074 Doing Homework(状压DP)
- hdu 1074 Doing Homework 状压dp