杭电ACM1074——Doing Homework~~状态压缩DP

原创 2015年07月28日 20:23:42

题目的意思:N门课程有作业,一个时间是最迟交的时间,一个是需要耗费多少时间来完成,到了期限,迟交多少,就扣多少分,求扣最少分的做作业的顺序。

N小于等于15,可以枚举所以的情况,数的二进制来表示各种情况。

对于集合编码成整数,可以看我的另一篇博客:点击打开链接

枚举每一门课程,S & (1 << i)表示第i门课程是否完成,为 1 就是完成了。

对于状态压缩DP还不是很熟,特别是位运算,很是蛋疼。

参考别人博客学习的。

下面的是AC的代码:

#include <iostream>
#include <cstring>
#include <string>
#include <stack>
using namespace std;

const int INF = 100000000;

struct data
{
	string name;
	int last, cost;
}Data[20];

struct DP
{
	int time, score, pre, now;//time为该状态多出来的时间,score是扣的分,pre,now用来记录路径
}dp[1 << 15 + 1];


int main()
{
	int t, n, i, end;
	cin >> t;
	while(t--)
	{
		memset(dp, 0, sizeof(dp));//初始化
		cin >> n;                 //输入
		for(i = 0; i < n; i++)
			cin >> Data[i].name >> Data[i].last >> Data[i].cost;
		end = 1 << n;
		for(int S = 1; S < end; S++)//枚举所以的状态
		{
			dp[S].score = INF;
			for(i = n - 1; i >= 0; i--)  //每一门课程
			{
				int temp = 1 << i;
				if(S & temp)             //判断第i门课程是否完成
				{ 
					int a = S - temp;    //集合S去掉 i,也就是第i门课程没完成,也就是上一个状态
					int s = dp[a].time + Data[i].cost - Data[i].last;
					if(s < 0)
						s = 0;
					if(s + dp[a].score < dp[S].score)   //分数小于现在的状态
					{
						dp[S].score = s + dp[a].score;
						dp[S].pre = a;                   //记录路径
						dp[S].now = i;                   //记录路径
						dp[S].time = dp[a].time + Data[i].cost;
					}
				}
			}
		}
		stack <int>Stack;
		cout << dp[end - 1].score << endl;
		int res = end - 1;
		while(res)          //取路径
		{
			Stack.push(dp[res].now);
			res = dp[res].pre;
		}
		while(!Stack.empty())  //输出
		{
			cout << Data[Stack.top()].name << endl;
			Stack.pop();
		}
	}
	return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU1074:Doing Homework(状态压缩DP)

Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of ...
  • libin56842
  • libin56842
  • 2014年04月22日 17:01
  • 6154

HDU1789:Doing Homework again

Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of ...
  • libin56842
  • libin56842
  • 2013年03月14日 20:47
  • 2509

动态规划入门——Doing Homework

转载请注明出处:http://blog.csdn.net/a1dark 分析:这道题比较坑、本来可以贪心、但是题目要求按照字典序输出、由于贪心会打乱排序、所以不能用、然后是搜索、由于有N等于15、1...
  • verticallimit
  • verticallimit
  • 2013年10月02日 10:10
  • 789

Doing Homework

位操作实现技巧:  如果要获得第i位的数据,判断((data&(0x1 如果要设置第i位为1,data=(data|(0x1 如果要设置第i位为0,data=(data&(~(0x1 如果要将第i位取...
  • qq_37605573
  • qq_37605573
  • 2017年10月26日 21:20
  • 78

【学习OpenGL小记之一】 OpenGL开发环境配置

一、开发环境 1、操作系统:Windows 7(64位) 2、编程环境:Microsoft Visual Studio 2010 二、环境配置 1、下载OpenGL库,这里可以自己从其他网...
  • qingyang8513
  • qingyang8513
  • 2015年05月07日 19:26
  • 926

thoughtworks面试总结

过程 1.主动投的简历,投简历过后很快就收到了HR的回复,然后约第二天半个小时的电话面试,就是基本情况的了解。就问一下当前的技术状况,学习状况,然后举例子当前项目中遇到的问题,怎么解决的。然后最后是聊...
  • JKINGCL
  • JKINGCL
  • 2014年01月16日 16:23
  • 9799

ACM--Doing Homework again(贪心算法)

题目大意:一个同学完成老师布置的作业。每个作业都有一个期限和对应的扣分。在截止日没有完成,则会扣相应的分。问:如何安排做作业的顺序,才能使扣的总分最少(完成一个作业需要1天) 思路:根据贪心的思想,...
  • qq328691560
  • qq328691560
  • 2015年07月17日 12:59
  • 319

hdu1074Doing Homework【状态压缩】

Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of h...
  • zhou_yujia
  • zhou_yujia
  • 2016年01月07日 09:45
  • 501

homework之数组

// swapimn2.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include using namespace std; void...
  • mmdaphne
  • mmdaphne
  • 2014年11月13日 19:14
  • 270

思特沃克作业

1.将一个要统计的数据信息存放在一个文件里面,如a.txt void Readfile(POAct * mypoact) 2.将文本文件里的字符串解析出来,转换成数字存储在自定义类型的变量里,并存...
  • zili_zq
  • zili_zq
  • 2016年10月16日 08:42
  • 615
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:杭电ACM1074——Doing Homework~~状态压缩DP
举报原因:
原因补充:

(最多只允许输入30个字)