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

CCF-CSP 37-2(完全背包问题)

#include<iostream> #include<vector> #include<unordered_map> #include<algorithm>//sort排序 using namespace std; //vector数组定义排序 bool compare(pair<int, int> p1, pair<int, int> p2) { return (p1.second / static_cast<double>(p1.first)) > (p2.second / static_cast<double>(p2.first)); } int main() { int n, m; cin >> n >> m; vector<pair<int, int>> arr; for (int i = 1; i <= m; i++) { int cur; cin >> cur; arr.push_back(make_pair(i, cur));//苹果个数:价值 } sort(arr.begin(), arr.end(), compare); int res = 0; int step = 0; while (n != 0) { int num = n / arr[step].first; cout << arr[step].first << endl; if (num == 0) { step++; continue; } n -= num * arr[step].first; res += num * arr[step].second; step++; } cout << res << endl; return 0; }

刚开始的想法是用vector数组以:得到价值/投喂个数 作为判断条件价值降序排列,以单个苹果价值高的优先考虑,样例一能够很好的解决但是样例二得到的结果不正确,分析后得到问题这个题目要考虑组合的问题,联想到背包问题,重新进行解决,将苹果个数作为背包容量,价值则为价值。

​ #include<iostream> #include<vector> using namespace std; int main() { int n, m; cin >> n >> m; vector<int> arr(m+1);//arr[i]存放大小为i的价值 for (int i = 1; i <= m; i++) { int value; cin >> value; arr[i] = value; } vector<int> dp(n+1,INT_MIN);//dp[i]表示容量为i产生的最大价值 dp[0] = 0; for (int i = 0; i <= n; i++) { if (dp[i] == INT_MIN)continue;//还不能拓展到 //在已知最优解的基础上拓展空间 for (int j = 1; j <= m; j++) { if (i + j > n)continue; if (dp[i + j] < dp[i] + arr[j]) { dp[i + j] = dp[i] + arr[j]; } } } cout << dp[n] << endl; return 0; } ​

这里需要注意,要从dp[0]开始拓展,我开始用的是dp[1] = arr[1]拓展,但是如果arr[2]>arr[1]+arr[1]就会出现未考虑的错误情况

下面附上回缩式的标准完全背包问题解法:

#include <iostream> #include <vector> #include <algorithm> #include <climits> using namespace std; int main() { int n, m; cin >> n >> m; vector<int> A(m + 1); A[0] = 0; for (int i = 1; i <= m; ++i) { cin >> A[i]; } //dp表示背包容量为n时最大值为多少 vector<int> dp(n + 1, INT_MIN); dp[0] = 0; for (int j = 1; j <= n; ++j) { for (int i = 1; i <= min(m, j); ++i) { if (dp[j - i] + A[i] > dp[j]) { //如果放入i会使最大值增加则更新 dp[j] = dp[j - i] + A[i]; } } } cout << dp[n] << endl; return 0; }

http://www.jsqmd.com/news/1141481/

相关文章:

  • STM32F415ZG与KMX62 IMU的嵌入式运动控制方案
  • SSRF与Redis未授权访问组合攻击:从边界突破到内网沦陷的实战解析
  • iPaaS与技术前身的对比(2)| iPaaS vs ETL
  • ThinkPad风扇静音革命:TPFanCtrl2让你的笔记本告别噪音烦恼
  • 3步搞定微信聊天记录永久备份:WeChatExporter完整指南
  • 3步掌握微信聊天记录导出:免费开源工具终极指南
  • 别再熬夜攒论文!7款AI论文写作工具1天搞定全学科初稿
  • PyTorch 2.x 版本兼容性决策树:CUDA 11.8/12.1/12.4 三选一指南
  • Nginx与MySQL等保2.0安全加固实战指南:从配置到监控
  • 跨平台直播内容持久化挑战的模块化解决方案
  • 从仿真走向真实空口:开源可复现无线科研平台的价值
  • 2026年东北交付速度TOP3的庭院灯生产厂家,究竟哪家值得选?
  • KMX62与STM32F412RE在动态平衡控制中的优化应用
  • 2026写论文有没有工具推荐呢?从论文大纲到交稿排版,这篇说明白了
  • OpenEuler/Space-Doc-Spec入门指南:从基础到实践的完整路径
  • TMSpeech:Windows本地实时语音转文字的革命性解决方案
  • 影刀RPA新手教程:流程规划完全指南——怎么把一个复杂任务拆成小块
  • AI Agent 运营工具周报:从浏览器执行到 SEO,7 个补件值得试
  • QQScreenShot独立版:免费免登录的QQ截图工具完整使用指南
  • [论文学习]从上下文学习中评估隐私洩漏-深度解析
  • Figma中文汉化终极指南:3分钟让你的设计界面变中文
  • KMR221与PIC18F46K42实现高精度电压监控方案
  • KMX62-1031与PIC18F85K90实现高精度平衡控制方案
  • 直流负载管理优化:G6D-ASI继电器与PIC18F65K40的工程实践
  • 一文搞懂 AI Agent 的记忆系统:从短期到长期,从本地到向量数据库
  • RTSP拉流失败排查参数配置说明
  • Function Calling、MCP、Agent 工具调用到底有什么区别?
  • Java 反序列化漏洞实战:从 ysoserial 工具链到 3 种主流框架利用分析
  • AltDrag终极指南:5分钟掌握Windows窗口管理的革命性技巧
  • 企业认证与安全体系(十):一张图看懂企业认证架构——从登录、鉴权到权限控制完整串联