hdu1074(状压)

/*
translation:
	给出n门作业,没门作业有期限和完成所需的时间。超过期限每一天就扣掉一分。求最少扣掉多少分。并按字典序给出
	作业的完成顺序。
solution:
	状压dp
	仔细观察题意可以发现就是求作业的某一种排列顺序使得满足最优解。所以用动态规划的状态表示一定涉及到集合。
	又考虑到数据量不多。所以可以用状态压缩。
note:
	1:注意枚举作业状态时候的顺序,见代码注释。
	# 最初的思路是这样定义状态的dp[i][j][k]:表示在第k天完成了i项作业,且最后一项作业为j的最小已拖延天数。
	  则状态转移方程:dp[i][j][k]=min(dp[i-1][t][k-ci])+k-dj。正确与否未知,待补。。。。。。
	* 注意这道题的dp数组表示方式。开太多维的数组没必要。
	* 涉及到集合的表示且数据量小的动规一般考虑状压。
date:
	2016.10.30
*/
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>

using namespace std;
const int maxn = 15;
const int INF = 1e9;

struct Subject
{
	string name;
	int d, c;
	Subject(string n, int d, int c):name(n),d(d),c(c){}
	Subject(){}
} sub[maxn];

struct DP
{
	int current, pre, score, time;	//当前状态完成的作业编号,先前一个状态的编号,到当前状态为止的最少惩罚,到当前状态的时间
} dp[1 << maxn + 5];	//dp[s]表示当前状态编号为s的各种信息。
int n;
bool vis[1 << maxn + 5];
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值