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

原创粉丝点击