Processing math: 100%

Loading

【dp每日一题】HDU 1074 Doing Homework

大意:

给出n(n<=15)个作业的用时和deadline,如果有作业超过deadline,那么每超过1天就要扣1分(超过多个作业也是1分),问扣分最少的方案,按字典序最小输出(题目保证输入按照字典序递增)

思路:

状压dp,枚举能转移过来的每个状态,更新dp数组即可

#include <bits/stdc++.h> using namespace std; const int N = 15 + 5; typedef long long LL; int T, n, d[N], t[N], dp[1 << N], l[1 << N], pre[1 << N], res[N], cnt, step[1 << N]; string name[N]; int main() { cin >> T; while (T--) { cin >> n; for (int i = 0; i < n; i++) { cin >> name[i] >> d[i] >> t[i]; } memset(dp, 0x3f, sizeof dp); memset(l, 0, sizeof l); dp[0] = 0; for (int i = 0; i < (1 << n); i++) { for (int j = 0; j < n; j++) { if ((1 << j) & i) { int prestate = i - (1 << j); int temp = max(0, l[prestate] + t[j] - d[j]); if (dp[prestate] + temp <= dp[i]) { dp[i] = dp[prestate] + temp; l[i] = l[prestate] + t[j]; pre[i] = prestate; step[i] = j; } } } } cnt = 0; int state = ( 1 << n ) - 1; cout << dp[state] << endl; while (state != 0) { res[cnt++] = step[state]; state = pre[state]; } for (int i = cnt - 1; i >= 0; i--) { cout << name[res[i]] << endl; } } return 0; }

__EOF__

本文作者dyhaohaoxuexi
本文链接https://www.cnblogs.com/dyhaohaoxuexi/p/14186345.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   WinterFa1L  阅读(82)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· 赶AI大潮:在VSCode中使用DeepSeek及近百种模型的极简方法
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
点击右上角即可分享
微信分享提示