【枚举】SSL_1320 买装备

本文探讨了在小数据规模下解决背包问题的一种简单而直接的方法:暴力求解。通过枚举所有可能的选择,找到满足特定条件且总代价最小的方案。文章提供了详细的C++实现代码,展示了如何通过递归深度优先搜索来遍历所有组合。

题意

给出几件物品,选择一些物品使得满足条件且代价最小。

思路

数据较小,暴力即可。

代码

#include<cstdio>
#include<algorithm>

struct node {
	int w, m, v;
}c[22];
int n, a, b, ans = 2147483647;

void dfs(int p, int v, int w, int m) {	
	if (w >= a && m >= b) {
		ans = std::min(ans, v);
		return;
	}
	if (v >= ans || p > n) return;
	dfs(p + 1, v + c[p].v, w + c[p].w, m + c[p].m);
	dfs(p + 1, v, w, m);
}

int main() {
	scanf("%d %d %d", &a, &b, &n);
	for (int i = 1; i <= n; i++)
		scanf("%d %d %d", &c[i].w, &c[i].m, &c[i].v);
	dfs(1, 0, 0, 0);
	printf("%d", ans);
}
源码来自:https://pan.quark.cn/s/a4b39357ea24 ### 操作指南:洗衣机使用方法详解#### 1. 启动与水量设定- **使用方法**:使用者必须首先按下洗衣设备上的“启动”按键,同时依据衣物数量设定相应的“水量选择”旋钮(高、中或低水量)。这一步骤是洗衣机运行程序的开端。- **运作机制**:一旦“启动”按键被触发,洗衣设备内部的控制系统便会启动,通过感应器识别水量选择旋钮的位置,进而确定所需的水量高度。- **技术执行**:在当代洗衣设备中,这一流程一般由微处理器掌管,借助电磁阀调控进水量,直至达到指定的高度。#### 2. 进水过程- **使用说明**:启动后,洗衣设备开始进水,直至达到所选的水位(高、中或低)。- **技术参数**:水量的监测通常采用浮子式水量控制器或压力感应器来实现。当水位达到预定值时,进水阀会自动关闭,停止进水。- **使用提醒**:务必确保水龙头已开启,并检查水管连接是否牢固,以防止漏水。#### 3. 清洗过程- **使用步骤**:2秒后,洗衣设备进入清洗环节。在此期间,滚筒会执行一系列正转和反转的动作: - 正转25秒 - 暂停3秒 - 反转25秒 - 再次暂停3秒- **重复次数**:这一系列动作将重复执行5次,总耗时为280秒。- **技术关键**:清洗环节通过电机驱动滚筒旋转,利用水流冲击力和洗衣液的化学效果,清除衣物上的污垢。#### 4. 排水与甩干- **使用步骤**:清洗结束后,洗衣设备会自动进行排水,将污水排出,然后进入甩干阶段,甩干时间为30秒。- **技术应用**:排水是通过泵将水抽出洗衣设备;甩干则是通过高速旋转滚筒,利用离心力去除衣物上的水分。- **使用提醒**:...
代码下载地址: https://pan.quark.cn/s/c289368a8f5c 在安卓应用开发领域,构建一个高效且用户友好的聊天系统是一项核心任务。 为了协助开发者们迅速达成这一目标,本文将分析几种常见的安卓聊天框架,并深入说明它们的功能特性、应用方法及主要优势。 1. **环信(Easemob)** 环信是一个专为移动应用打造的即时通讯软件开发套件,涵盖了文本、图片、语音、视频等多种消息形式。 通过整合环信SDK,开发者能够迅速构建自身的聊天平台。 环信支持消息内容的个性化定制,能够应对各种复杂的应用场景,并提供多样的API接口供开发者使用。 2. **融云(RongCloud)** 融云作为国内领先的IM云服务企业,提供了全面的聊天解决方案,包括一对一交流、多人群聊、聊天空间等。 融云的突出之处在于其稳定运行和高并发处理性能,以及功能完备的后台管理工具,便于开发者执行用户管理、消息发布等操作。 再者,融云支持多种消息格式,如位置信息、文件传输、表情符号等,显著增强了用户聊天体验。 3. **Firebase Cloud Messaging(FCM)** FCM由Google提供的云端消息传递服务,可达成安卓设备与服务器之间的即时数据交换。 虽然FCM主要应用于消息推送,但配合Firebase Realtime Database或Firestore数据库,开发者可以开发基础的聊天软件。 FCM的显著优势在于其全球性的推送网络,保障了消息能够及时且精确地传输至用户。 4. **JMessage(极光推送)** 极光推送是一款提供消息发布服务的软件开发工具包,同时具备基础的即时通讯能力。 除了常规的文字、图片信息外,极光推送还支持个性化消息,使得开发者能够实现更为复杂的聊天功能。 此...
你问得非常好! ```c int err = ssl_get_error(ssl_conn, read_size); ``` 这个函数 **在标准 mbedTLS API 中是存在的,但名字不是 `ssl_get_error`,而是 `mbedtls_ssl_get_verify_result` 或更常见的是通过返回值判断错误码**。 我们来彻底澄清这个问题: --- ## ❌ 事实:`ssl_get_error(ssl_conn, read_size)` 不是 mbedTLS 的原生函数 ### ✅ 正确答案: > **`ssl_get_error()` 并不是 mbedTLS 官方 API 的一部分**。 > 它是你当前项目中 **对 mbedTLS 封装层(`ssl_mbedtls.c`)自行定义的一个辅助函数**。 --- ## 🔍 mbedTLS 原生错误处理机制 在 **原始 mbedTLS(ARM mbedtls library)** 中: - 所有函数返回负数表示错误 - 错误码是负的宏定义,例如: ```c MBEDTLS_ERR_SSL_WANT_READ MBEDTLS_ERR_SSL_WANT_WRITE MBEDTLS_ERR_X509_INVALID_SIGNATURE ``` - 判断是否“需要读/写”直接比较返回值即可,不需要额外调用 `SSL_get_error()` 这种 OpenSSL 风格的函数 ### 示例:原生 mbedTLS 写法 ```c int ret = mbedtls_ssl_read(&ssl_context, buf, len); if (ret > 0) { // 成功读取 ret 字节 } else if (ret == 0) { // 对端关闭连接 } else { if (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE) { // 非阻塞等待,继续循环 continue; } else { // 真正的错误 printf("SSL read failed: -0x%x\n", -ret); break; } } ``` 👉 所以:**没有 `SSL_get_error()` 函数!** --- ## 🧩 为什么你会看到 `ssl_get_error()`? 因为你使用的是 **封装过的 mbedTLS 接口**(通过 `ssl_backend.h` 和 `ssl_mbedtls.h` 提供) 你的团队或代码框架很可能做了以下封装: ```c // 在 ssl_mbedtls.c 或类似文件中定义 int ssl_get_error(struct tp_ssl *ssl, int ret) { // 其实就是返回原值,或者映射成 OpenSSL 风格 return ret; // 因为 mbedTLS 返回本身就是错误码 } ``` 或者更复杂的兼容性封装: ```c int ssl_get_error(void *unused, int ret) { if (ret == MBEDTLS_ERR_SSL_WANT_READ) return SSL_ERROR_WANT_READ; else if (ret == MBEDTLS_ERR_SSL_WANT_WRITE) return SSL_ERROR_WANT_WRITE; else return SSL_ERROR_OTHER; } ``` > ⚠️ 注意:这里的 `struct tp_ssl*` 参数其实没用到,只是为了接口匹配。 --- ## ✅ 结论与建议 | 问题 | 回答 | |------|------| | `ssl_get_error(ssl_conn, read_size)` 是哪来的? | 是你们项目的 **自定义封装函数**,不在原始 mbedTLS 中存在 | | 能不能用? | ✅ 可以用 —— **前提是 `ssl_mbedtls.c` 里实现了它** | | 如果没有实现怎么办? | ❌ 会链接报错:`undefined reference to 'ssl_get_error'` | --- ## ✅ 解决方案:两种选择 ### ✅ 方案 1(推荐):删除 `ssl_get_error` 调用 → 直接比较返回值 修改这部分代码: ```c int read_size = ssl_read(ssl_conn, buf + read_offset, ...); if (read_size <= 0) { int err = ssl_get_error(ssl_conn, read_size); // ← 删除这一行 if (err == MBEDTLS_ERR_SSL_WANT_READ || err == MBEDTLS_ERR_SSL_WANT_WRITE) { continue; } break; } ``` ### 🔁 替换为(直接判断): ```c int read_size = ssl_read(ssl_conn, buf + read_offset, TPAP_SESSION_PACKET_MAX_LEN - read_offset); if (read_size > 0) { // 正常数据 read_offset += read_size; // ... } else if (read_size == 0) { // 对端关闭 break; } else { // 负数才是错误 if (read_size == MBEDTLS_ERR_SSL_WANT_READ || read_size == MBEDTLS_ERR_SSL_WANT_WRITE) { // 继续尝试 continue; } else { PAKEDebug("SSL read error: %d\n", read_size); break; } } ``` ✅ 这是最标准、最安全、最清晰的做法。 --- ### ✅ 方案 2:保留 `ssl_get_error` → 要求 `ssl_mbedtls.c` 实现它 如果你坚持要用: ```c int err = ssl_get_error(ssl_conn, ret); ``` 那你必须确保在 `ssl_mbedtls.c` 中有如下实现: ```c // ssl_mbedtls.c int ssl_get_error(struct tp_ssl *ssl, int ret) { (void)ssl; // 未使用 return ret; // mbedTLS 的返回值本身就是错误码 } ``` 或者如果你想模仿 OpenSSL 返回枚举类型: ```c #define SSL_ERROR_WANT_READ 2 #define SSL_ERROR_WANT_WRITE 3 #define SSL_ERROR_SYSCALL 5 int ssl_get_error(struct tp_ssl *ssl, int ret) { switch (ret) { case MBEDTLS_ERR_SSL_WANT_READ: return SSL_ERROR_WANT_READ; case MBEDTLS_ERR_SSL_WANT_WRITE: return SSL_ERROR_WANT_WRITE; default: return ret < 0 ? -ret : 0; // 或其他逻辑 } } ``` ⚠️ 但这种“模拟 OpenSSL 行为”的做法容易引起混淆,不推荐。 --- ## ✅ 最终建议 🔧 **强烈建议采用方案 1:直接判断返回值,不要依赖 `ssl_get_error`** ### 修改后代码示例: ```c int read_size = ssl_read(ssl_conn, buf + read_offset, TPAP_SESSION_PACKET_MAX_LEN - read_offset); if (read_size > 0) { read_offset += read_size; if (tscp_is_packet_recv_finished(buf, read_offset)) { uint16_t response_size = 0; print_hex("TPAP Packet", buf, read_offset); int ret = server_handle_request(context, buf, read_offset, &response_size, sa_cli); if (response_size > 0) { ssl_write(ssl_conn, buf, response_size); } read_offset = 0; memset(buf, 0, TPAP_SESSION_PACKET_MAX_LEN); } } else if (read_size == 0) { // Connection closed by peer break; } else { // Error or want read/write if (read_size == MBEDTLS_ERR_SSL_WANT_READ || read_size == MBEDTLS_ERR_SSL_WANT_WRITE) { continue; } else { PAKEDebug("ssl_read error: %d\n", read_size); break; } } ``` --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值