首页 > 代码库 > HDU 1074 Doing Homework(状压DP)
HDU 1074 Doing Homework(状压DP)
题目地址:HDU 1074
这题攒了好长时间了。。。一直没写。。
简单状压DP。这题比較特别的地方是dp须要用结构体数组。
具体的请看kuangbin大神的模板。。传送门
代码例如以下:
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include <map> #include <set> #include <algorithm> using namespace std; #define LL __int64 const int INF=0x3f3f3f3f; struct node1 { char s[110]; int d, c; }fei[20]; struct node2 { int d, p, pre, t; }dp[1<<16]; void output(int x) { if(dp[x].pre==-1) return ; output(dp[x].pre); printf("%s\n",fei[dp[x].t].s); } int main() { int t, n, i, j, x, y, ans, tmp, k; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=0;i<n;i++) { getchar(); scanf("%s%d%d",fei[i].s,&fei[i].d,&fei[i].c); } k=1<<n; dp[k-1].d=0; dp[k-1].p=0; dp[k-1].pre=-1; for(i=k-2;i>=0;i--) { dp[i].p=INF; } for(i=k-1;i>=0;i--) { for(j=0;j<n;j++) { if(i&(1<<j)) { tmp=i-(1<<j); x=dp[i].d+fei[j].c; y=dp[i].p; if(x>fei[j].d) y=dp[i].p+x-fei[j].d; if(dp[tmp].p>y) { dp[tmp].p=y; dp[tmp].t=j; dp[tmp].d=x; dp[tmp].pre=i; } } } } printf("%d\n",dp[0].p); output(0); } return 0; }
HDU 1074 Doing Homework(状压DP)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。