HDU1074

来源:互联网 发布:蜂群算法matlab代码 编辑:程序博客网 时间:2024/06/04 12:51

//对DP还是无感╮(╯▽╰)╭

//状态DP看到网上还有人用DFS过了,只是时间多点

//具体的什么思路什么的还是去看KUANG_BIN大神的吧,之前还真没想过DP还可以这么写

#include<iostream>#include<string.h>#include<string>using namespace std;int visit[1<<16];struct node{    int pre;    int cost;    int time;}dp[1<<16];struct course1{    int cost;    int deal;    string name;}course[16];void print(int cur){    int work=cur^dp[cur].pre;    int number=0;    work=work>>1;    while(work)    {        number++;        work=work>>1;    }    if(dp[cur].pre!=0)        print(dp[cur].pre);    cout<<course[number].name<<endl;}int main(){    int casenumber;    scanf("%d",&casenumber);    while(casenumber--)    {        int n;        memset(visit,0,sizeof(visit));        scanf("%d",&n);        int i,j;        for(i=0;i<n;i++)        {            cin>>course[i].name>>course[i].deal>>course[i].cost;        }        dp[0].pre=-1;        dp[0].cost=0;        dp[0].time=0;        for(i=0;i<(1<<(n));i++)        {            for(j=0;j<n;j++)            {                int k=1<<j;                if((i&k)==0)                {                    int now=i|k;                    int total=dp[i].time+course[j].cost;                    dp[now].time=total;                    int reduce=total-course[j].deal;                    if(reduce<0)                        reduce=0;                    reduce+=dp[i].cost;                    if(visit[now]==1)                    {                        if(reduce<dp[now].cost)                        {                            dp[now].cost=reduce;                            dp[now].pre=i;                        }                        if(reduce==dp[now].cost)                        {                            if(dp[now].pre>i)                            {                                dp[now].pre=i;                            //    dp[k].cost=reduce;                            }                        }                    }                    else                    {                        visit[now]=1;                        dp[now].pre=i;                        dp[now].cost=reduce;                    }                }            }        }        cout<<dp[(1<<(n))-1].cost<<endl;        print((1<<(n))-1);    }}


0 0