状态压缩-----HDU1074 Doing Homework
HDU1074 Doing Homework
题意:给了n个家庭作业,然后给了每个家庭作业的完成期限和花费的实践,如果完成时间超过了期限,那么就要扣除分数,然后让你找出一个最优方案使扣除的分数最少,当存在多种方案时,输出字典序最小的那种,因为题意已经说了家庭作业的名字是按照字典序从小到大输入的,所以处理起来就好多了。
分析:此题的关键是如何记录路径,具体看代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath> using namespace std;
#define MAX 1<<15+1
int N;
struct Node{
char name[];
int deadline;
int cost;
}homework[];
struct START
{
int time;
int pre;
int score;
int now;
} dp[MAX];
int record[]; void DP()
{
int Final=(<<N)-,punish,previous;
dp[].id=dp[].now=dp[].pre=dp[].score=dp[].time=;
for(int i=;i<=Final;i++)
{
dp[i].score=;
for(int j=;j<N;j++)
if(i&(<<j))
{
previous=(i-(<<j));
if(dp[previous].time+homework[j].cost>homework[j].deadline)
punish=dp[previous].time+homework[j].cost-homework[j].deadline;
else punish=;
if(dp[i].score>=dp[previous].score+punish)
{
dp[i].score=dp[previous].score+punish;
dp[i].time =dp[previous].time+homework[j].cost;
dp[i].pre=previous;
dp[i].now=j;
}
}
}
printf("%d\n",dp[Final].score);
int cal=Final,num=;
while(cal)
{
record[num++]=dp[cal].now;
cal=dp[cal].pre;
}
for(int i=num-;i>=;i--)
puts(homework[record[i]].name); }
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&N);
for(int i=;i<N;i++)scanf("%s%d%d",homework[i].name,&homework[i].deadline,&homework[i].cost);
DP();
}
return ;
}
做这题做的很是沮丧,在DP()中把j写成j+1了,看了很久愣是没看出来,慢慢调试了将近1小时后才发现。
void DP()
{
int Final=(<<N)-,punish,previous;
dp[].id=dp[].now=dp[].pre=dp[].score=dp[].time=;
for(int i=;i<=Final;i++)//状态从全0到全1
{
dp[i].score=;//为了找出最小值所以先初始化成比较大的值
for(int j=;j<N;j++)//题编号
if(i&(<<j))//状态i中有题j,为什么这样写是因为保证在状态全一的时候
//枚举过每一种可能,即由状态previous转化成状态j
{
previous=(i-(<<j));//从previous到i仅相差一个作业
//若从状态previous再做一题总时间加起来超过了作业j的deadline,记录扣几分
//否则为零
if(dp[previous].time+homework[j].cost>homework[j].deadline)
punish=dp[previous].time+homework[j].cost-homework[j].deadline;
else punish=;
//寻找状态为i时候的最小值
if(dp[i].score>=dp[previous].score+punish)
{
dp[i].score=dp[previous].score+punish;
dp[i].time =dp[previous].time+homework[j].cost;
dp[i].pre=previous;
dp[i].now=j;
}
}
}
printf("%d\n",dp[Final].score);
//显示路径now代表的是状态i是由写了一道编号为now的题形成的,previous是i的前一状态
int cal=Final,num=;
while(cal)
{
record[num++]=dp[cal].now;
cal=dp[cal].pre;
}
for(int i=num-;i>=;i--)
puts(homework[record[i]].name); }
状态压缩-----HDU1074 Doing Homework的更多相关文章
- 状态压缩 HDU1074
t组数据 n门课程 底限 完成要几天 dp[i] 表示i的二进制数中 1 对应位置课程 完成 最少扣多少分 完成的时间 记录一下怎么下来的 1->2^n 列举 (1<<n) ...
- hdu1074 Doing Homework(状态压缩DP Y=Y)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- HDU1074 Doing Homework 状态压缩dp
题目大意: 根据完成任务的截止时间,超时一天罚1分,求完成所有任务后的最小罚时 这里n最大为15,可以利用状态压缩来解决问题 /* 首先要明白的一点是状态1/0分别表示这件事做了还是没做 而1/0的位 ...
- HDU 1074 Doing Homework (dp+状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:学生要完成各科作业, 给出各科老师给出交作业的期限和学生完成该科所需时间, 如果逾期一 ...
- HDU1074(KB12-D 状态压缩dp)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- HDU1074(状态压缩DP)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- HDU 1074 Doing Homework (状态压缩 DP)
题目大意: 有 n 项作业需要完成,每项作业有上交的期限和需完成的天数,若某项作业晚交一天则扣一分.输入每项作业时包括三部分,作业名称,上交期限,完成所需要的天数.求出完成所有作业时所扣掉的分数最少, ...
- HDU 1074 Doing Homework(状态压缩)
之前做过一个题,是在学贪心的时候做的,所以这个题就想当然的跑偏了,当看到N是<=16 的时候,状态压缩就理所当然了 #include<iostream> #include<cs ...
- HDU 1074 Doing Homework(DP状态压缩)
题意:有n门功课需要完成,每一门功课都有时间期限以及你完成所需要的时间,如果完成的时间超出时间期限多少单位,就会被减多少学分,问以怎样的功课完成顺序,会使减掉的学分最少,有多个解时,输出功课名字典序最 ...
随机推荐
- leetcode 21.Merge Two Sorted Lists ,java
题目: Merge two sorted linked lists and return it as a new list. The new list should be made by splici ...
- 第15篇 PSR-04 规范
1. Overview This PSR describes a specification for autoloading classes from file paths. It is fully ...
- Mongodb3.0 新增用户身份验证db.createUser()
定义:创建一个数据库新用户用db.createUser()方法,如果用户存在则返回一个用户重复错误. 语法:db.createUser(user, writeConcern) user这个文档创 ...
- angular 本地存储
localStorage四种方法: localStorage.getItem(key):获取指定key本地存储的值localStorage.setItem(key,value):将value存储到ke ...
- Py修行路 python基础 (三)字典
names=["zhang"]names2=["jack","jie"]names.clear()print(names) #清空整个列表 ...
- Python3 持久化pickle模块
pickle提供了一个简单的持久化功能.可以将对象以文件的形式存放在磁盘上. 1.pickle.dump(obj, file[, protocol]) 序列化对象,并将结果数据流写入到文件对象中.参数 ...
- QR 码的位置检测符
QR码的位置检测符由三个同心正方形叠加而成.分别为: 7*7 modules的黑色正方形: 5*5 modules的白色正方形 : 3*3modules的黑色正方形. 三个用于定位检测的“回”形符号应 ...
- CBitmap Detach和DeleteObject的关系
注意:当使用完资源后,必须通过调用函数以释放加速器表.位图.光标.图标以及菜单所占的内存资源: 加速器表:DesteoyAcceleratorTable: 位图:DeleteObj ...
- JQuery实现瀑布流页面
views.py from django.shortcuts import render,HttpResponse from app01 import models import json # Cre ...
- Composer安装(windows)
https://files.cnblogs.com/files/wlphp/Composer-Setup.zip 先下载这个安装包,一直下一步 然后设置composer全局中国景象 composer ...