杭电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;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25425023/article/details/47110515

DP系列之二进制状态压缩--杭电1074

状态压缩的意图是用每一位二进制表示一个状态,0表示选中状态,1表示不选状态,如果有N个物体,从中选择若干个物体,那么最终选中的状态可以用一个N位的二进制位来表示 比如 若选择了第1个物体和第3个物...
  • shen823797837
  • shen823797837
  • 2013-01-28 21:17:09
  • 1844

hdoj 1074 Doing Homework 【状态压缩dp】

题目:hdoj 1074 Doing Homework  题意:给出一些任务15个,每个任务有截至时间和需要做的天数,超期一天扣一分,求让扣分最小的安排方案。 分析:用状态压缩枚举...
  • y990041769
  • y990041769
  • 2014-09-25 10:07:58
  • 1232

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:01
  • 6510

hdu1074之状态压缩dp

Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...
  • xingyeyongheng
  • xingyeyongheng
  • 2014-03-21 20:34:58
  • 4613

HDU 1074 Doing Homework

状态压缩DP
  • ChiLuManXi
  • ChiLuManXi
  • 2015-10-24 12:08:39
  • 401

HDU 1074 Doing Homework 状压Dp

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=68966#problem/D 题意:给定各个科目的截至时间和完成该科目所需要的...
  • I_am_a_winer
  • I_am_a_winer
  • 2015-05-02 00:18:48
  • 340

【ACM】D. Lettree's Math Homework

D. Lettree’s Math Homework题目描述Little lettree is a middle school student who is clever but hates doin...
  • linglun3
  • linglun3
  • 2015-04-11 19:21:43
  • 345

【杭电1789】Doing Homework again贪心(还不太懂)

Doing Homework again Description zichen has just come back school from the 30th ACM/ ICPC....
  • idealistic
  • idealistic
  • 2016-07-23 16:04:44
  • 284

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:01
  • 2594

【杭电1789】Doing Homework again

#include #include using namespace std; struct note { int day; int score;//分数 bool mark; ...
  • better_space
  • better_space
  • 2016-07-22 20:37:42
  • 151
收藏助手
不良信息举报
您举报文章:杭电ACM1074——Doing Homework~~状态压缩DP
举报原因:
原因补充:

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