hdoj 1074 Doing Homework 【状态压缩dp】

题目:hdoj 1074 Doing Homework

题意:给出一些任务15个,每个任务有截至时间和需要做的天数,超期一天扣一分,求让扣分最小的安排方案。

分析:用状态压缩枚举所有的状态,dp【st】表示在st状态下的最小扣分

转移方程:dp【st | (1<<i)】 = min( dp[st | ( 1 << i ) ] , dp[ st ] + 当前 i 超期的扣分 )

注意这个题目需要打印路径,所以还要一个数组保存状态的转移,递归输出结果即可。

AC

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
const int N = 16;
int dp[1<<N];
struct Node
{
    string s;
    int time,cost;
};
Node a[N];
int pre[1<<N];
int n;
void Output(int status)
{
    if(status==0)return;
    int t=0;
    for(int i=0;i<n;i++)
      if( (status&(1<<i))!=0 && (pre[status]&(1<<i))==0 )
      {
          t=i;
          break;
      }
    Output(pre[status]);
    cout<<a[t].s<<endl;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            cin>>a[i].s>>a[i].time>>a[i].cost;
        }
        memset(dp,0x3f3f3f3f,sizeof(dp));
        memset(pre,0,sizeof(pre));
        dp[0]=0;
        for(int st=0;st<(1<<n);st++)
        {
            //printf("**************************\n");
            int tmp=0;
            for(int i=0;i<n;i++)
            {
                if(st&(1<<i))
                    tmp+=a[i].cost;
            }
            for(int i=0;i<n;i++)
            {
                //printf("fff %d %d %d",st,(1<<i),st&(1<<i));
                if((st&(1<<i))==0)
                {
                    if(dp[st|(1<<i)]>dp[st]+max(0,tmp+a[i].cost-a[i].time)){
                        dp[st|(1<<i)]=dp[st]+max(0,tmp+a[i].cost-a[i].time);
                        pre[st|(1<<i)]=st;
                    }
                }
            }

        }
        printf("%d\n",dp[(1<<n)-1]);
        Output((1<<n)-1);
    }
    return 0;
}
时间: 2024-10-14 19:20:32

hdoj 1074 Doing Homework 【状态压缩dp】的相关文章

HDU 1074 Doing Homework(状态压缩 + DP)

Problem Description: Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every teacher gives him a deadline of handing in the homework. If Ignatius hands in the homework after the deadline, the teacher will

HDU 1074 Doing Homework(状态压缩DP)

题意:有n门课,每门课有截止时间和完成所需的时间,如果超过规定时间完成,每超过一天就会扣1分,问怎样安排做作业的顺序才能使得所扣的分最小 思路:二进制表示. 1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<cstdio> 6 #include<set> 7 #include<map> 8

HDU1074 Doing Homework 状态压缩dp

题目大意: 根据完成任务的截止时间,超时一天罚1分,求完成所有任务后的最小罚时 这里n最大为15,可以利用状态压缩来解决问题 1 /* 2 首先要明白的一点是状态1/0分别表示这件事做了还是没做 3 而1/0的位置表示这是哪一件事 4 比如说 5 可以表示为101,那么表示第一个和第三个任务已经完成 5 而dp[5]表示第一个和第三个任务完成所花费的最短时间 6 而状态5(101)是从状态1(001)或者状态4(100)转移过来的 7 也就是说我们总是可以通过一个较小的状态不断递推一个较大状态的

Doing Homework 状态压缩DP

Doing Homework 题目抽象:给出n个task的name,deadline,need.  每个任务的罚时penalty=finish-deadline;   task不可以同时做.问按怎样的顺序做使得penalty最小.同时输出顺序.如果有多个满足条件的顺序,按字典序输出. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #inc

状态压缩DP,附上例题(HDU - 1074 Doing Homework )

状态压缩DP:本生有很多状态,然后压缩成一种状态. 很多时候都会使用位运算 Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10077    Accepted Submission(s): 4832 Problem Description Ignatius has just come back school

hdoj 5125 Little Zu Chongzhi&#39;s Triangles【状态压缩dp】

题目:hdoj 5125 Little Zu Chongzhi's Triangles 题意:给出n个木棍的长度,然后问这些木棍所能组成三角形的最大面积. 分析:这个题目用状态压缩解,因为木棍的最大个数为12 我们枚举所有状态,用状态对应位的 0 和 1 表示这个木棍是否选择,然后如果某个状态选择的木棍是3的话,判断是否可以组成,可以的话dp[st] = 三角形面积 然后大于三的,分解之后得出转移方程dp[st] = max(dp[st],dp[i] + dp[st - i]) (i | (st

HDU 1074 Doing Homework(状压DP)

Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every teacher gives him a deadline of handing in the homework. If Ignatius hands in the homework after the deadline, the teacher will r

HDU_1074_Doing Homework_状态压缩dp

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7543    Accepted Submission(s): 3375 Problem Description Ignatius has just come b

HDU1074(状态压缩DP)

Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7070    Accepted Submission(s): 3104 Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lo