当前位置: 首页 > news >正文

算法-背包问题

算法思路

尽可能多的获得报酬,很容易想到背包问题,这里 d 是截止时间,那么我们可以用 m 来记录最大的截止时间,然后我们可以把所有物品按照 d 排序,从小到大枚举所有物品就 OK 了

#include<bits/stdc++.h>
using namespace std;
const int N = 5050; // 定义最大工作数量int t[N], d[N], p[N]; // 存储每项工作的耗时、截止时间和报酬
int n, m; // n 是工作数量,m 是最大截止时间
int f[N]; // 动态规划数组,f[j] 表示在时间 j 时可以获得的最大报酬struct node {int t, d, p; // 工作的结构体,包含耗时、截止时间和报酬
};
node a[N]; // 存储工作的结构体数组// 比较函数,按照截止时间从小到大排序
bool cmp(node a, node b) {return a.d < b.d;
}int main() {int k;cin >> k; // 读取测试数据的组数while (k--) {m = 0;cin >> n; // 读取工作数量for (int i = 1; i <= n; i++) {cin >> a[i].t >> a[i].d >> a[i].p; // 读取每项工作的耗时、截止时间和报酬m = max(m, a[i].d); // 更新最大截止时间}sort(a + 1, a + 1 + n, cmp); // 按照截止时间排序for (int i = 0; i <= m; i++)f[i] = 0; // 初始化动态规划数组for (int i = 1; i <= n; i++) {// 倒序遍历时间,确保每个工作只被处理一次for (int j = a[i].d; j >= a[i].t; j--) {// 更新动态规划数组f[j] = max(f[j], f[j - a[i].t] + a[i].p);}}int ans = 0;for (int i = 0; i <= m; i++)ans = max(ans, f[i]); // 找到最大报酬cout << ans << endl; // 输出结果}return 0;
}

 

相关文章:

  • 交换机环路故障分析以及解决方案
  • CAD背景怎么改成黑色?
  • web第七次课后作业--springbootWeb响应
  • 大型软件系统日志记录最佳实践
  • 153. 寻找旋转排序数组中的最小值
  • 手写字魔法消除3:深度学习PmrNet神经网络实现图片修复(含训练代码、数据集和GUI交互界面)
  • 零基础设计模式——结构型模式 - 外观模式
  • Docker 环境搭建与三大数据库(MySQL/Redis/MongoDB)部署教程
  • [Hackers and Painters] 读书笔记 | 设计模式思想 | LISP
  • 可视化提示词(Prompt)在训练过程中的优化过程:visualize_prompt_evolution
  • JAVA实战开源项目:农商对接系统 (Vue+SpringBoot) 附源码
  • 睡眠分期 html
  • 【SDR课堂第26讲】USRP-4120软件定义无线电平台性能指标测试(四)
  • NV295NV306美光固态闪存NV313NW830
  • promptfoo:让语言模型评测不再“靠感觉”——一站式 LLM 自动化测评神器深度解读
  • 框架漏洞(1)SpringBoot
  • ABF膜介绍
  • Java 事务管理:在分布式系统中实现可靠的数据一致性
  • python第35天打卡
  • 黑马程序员C++核心编程笔记--1 程序的内存模型
  • html用表格来做网站布局/中国网站排名查询
  • 网站设计怎么写/b站推广网站入口
  • 做外贸公司网站/成品视频直播软件推荐哪个好一点
  • wordpress多级分类文章/广州宣布5条优化措施
  • 湖南建设厅网站不良记录/移动建站优化
  • 网站和管理系统的区别/链接怎么做