hdu 1074 状态压缩dp

题目描述:有 n 门课程的作业,每门都有完成期限D,与完成所需时间C,若超过期限,1天扣1分。

问完成这n门作业至少要扣多少分,并输出扣分最少的做作业顺序。

思路:

dp[i]记录完成状态为i的情况下的信息。(完成所需时间,上一个状态,最小扣分)

状态方程:dp[i] = min(dp[j]+cost(j,i)) (从j状态能到i状态)

code:

 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long LL;
#define inf 0x3f3f3f3f
#define M 1<<15
struct node
{
    int cost;//完成所需时间
    int sub;//最小扣分
    int pre;//上一个状态
}dp[M];
struct course
{
    char name[105];
    int dead,need;
}c[16];
void print(int s)//递归打印解
{
    int job=s^dp[s].pre;
    int id=0;
    while(job)
    {
        id++;
        job>>=1;
    }
    id--;
    if(dp[s].pre)
        print(dp[s].pre);
    printf("%s\n",c[id].name);
}
int main()
{
    int t;
    int n,i,j;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(i=0;i=0;j--)
            {
                if(i&(1<c[j].dead)//超过期限
                        tem=dp[last].sub+dp[last].cost+c[j].need-c[j].dead;
                    else tem=dp[last].sub;
                    if(tem


你可能感兴趣的:(dp,状态压缩)