hdu1074 状压dp
来源:互联网 发布:解放军报网络图片赵阳 编辑:程序博客网 时间:2024/04/20 10:15
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<stack>#define maxn 10005#define INF 10000000using namespace std;struct node{ string s; int d,c;}a[22];struct dpp{ int pre;//前一个状态 int now_time;//当前的时间 int cost;//当前扣除的最小分数 int p;//以那个点结尾扣除的分数最小}dp[1<<16];int main(){ int t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=0; i<n; i++) { cin>>a[i].s; scanf("%d%d",&a[i].d,&a[i].c); } dp[0].cost=dp[0].pre=dp[0].now_time=0; for(int i=1;i<(1<<n);i++) { dp[i].cost=INF; for(int j=n-1;j>=0;j--) { if(i&(1<<j)) { int tmp;//当前将要扣除的分数 int now_pre;//当前的前一个状态 now_pre=i-(1<<j); if(dp[now_pre].now_time+a[j].c>a[j].d) { tmp=dp[now_pre].now_time+a[j].c-a[j].d; } else { tmp=0; } if(dp[i].cost>(dp[now_pre].cost+tmp)) { dp[i].cost=dp[now_pre].cost+tmp; dp[i].now_time=dp[now_pre].now_time+a[j].c; dp[i].pre=now_pre; dp[i].p=j; } } } } int now=(1<<n)-1; printf("%d\n",dp[now].cost); stack<int> s; while(dp[now].now_time) { int p=dp[now].p; s.push(p); now=dp[now].pre; } while(!s.empty()) { int p=s.top(); cout<<a[p].s<<endl; s.pop(); } } return 0;}