hdu1074Doing Homework dp+状态压缩

/*
可以用0和1来表示该科目是否完成
那么可以用二进制来表示科目完成的状态
如:假设状态数是5<==>101 那么第一个和第三个科目已经完成
那么就可以遍历所有状态,然后在每个状态下遍历所有任务
*/
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define maxn 1<<15
struct node
{
    int pre;//dp[i]前一个状态,从而能在输出的时候通过递归输出
    int cost;//dp[i]到i状态时的所花时间
    int reduce;//dp[i]到i状态时的所减的最短时间
}dp[maxn];
struct node1
{
    char name[110];
    int deadline;
    int day;
} course[maxn];
int vis[maxn];
int N;
void DP()
{
    memset(vis,0,sizeof(vis));
    int i;int j;
    dp[0].cost=0;
    dp[0].pre=-1;
    dp[0].reduce=0;
    vis[0]=1;
    int upper=(1<<N)-1;
    for(i=0;i<upper;i++)//遍历所有状态
    {
        for(j=0;j<N;j++)
        {
            int cur=1<<j;
            if((i&cur)==0)//构成能做第j个作业的条件
            {
                int curtemp=cur|i;//当前状态做了第j个作业后的状态
                int day=dp[i].cost+course[j].day;
                dp[curtemp].cost=day;
                int reduce=day-course[j].deadline;
                if(reduce<0)reduce=0;
                reduce+=dp[i].reduce;
                if(vis[curtemp]&&reduce<dp[curtemp].reduce)
                {
                   dp[curtemp].reduce=reduce;
                   dp[curtemp].pre=i;
                }
                if(vis[curtemp]==0)
                {
                    vis[curtemp]=1;
                    dp[curtemp].reduce=reduce;
                    dp[curtemp].pre=i;
                }
            }
        }
    }
}
void output(int cur)
{
    int curtemp=cur^dp[cur].pre;
    int cour=-1;
    while(curtemp)
    {
        cour++;
        curtemp>>=1;
    }
    if(dp[cur].pre!=0)
    output(dp[cur].pre);
    printf("%s\n",course[cour].name);
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&N);
        int i;
        for(i=0;i<N;i++)
            scanf("%s%d%d",course[i].name,&course[i].deadline,&course[i].day);
        DP();
        int temp=(1<<N)-1;
        printf("%d\n",dp[temp].reduce);
        output((1<<N)-1);
    }
    return 0;
}



你可能感兴趣的:(hdu1074Doing Homework dp+状态压缩)