hun暑期实训 最大报销额(01背包) 关于动态内存分配的new与delete
文章目录
- 题目
- 思路
- AC代码1
- AC代码2
- new与delete
题目
思路
这个题主的难点要有三个方面。
第一个方面是数据不好输入。题目中所给的数据都是做题需要的数据,而且是需要分开存储的。对于字母:数字的格式输入,我们可以采用scanf的格式化输入来完成,从而实现,字母、数字分开操作;
第二个方面就是01背包的问题,这个题目给出的数据全是小数,而01背包的一维数组类型需要对背包内存Q进行逆序循环,从而要求是整数,由于题中所给出的小数都是两位数的,所以我们可以将它们×100再进行运算;
第三个方面是01背包问题中一维数组创立的问题,显然这个一维数组是不能用容器vector来代替的(想想为什么?),而题中所给的Q×100后可以会达到十万级别,但是有时的Q不排除较小的情况,这样一来,我们对于一维数组申请内存就不太好操作,过大可能会超出限度,过小会导致越界。因此我们需要用new与delete来动态分配内存。
AC代码1
#include <bits/stdc++.h>
using namespace std;
char type;
double d_price, d_Q;
int n, num;
string s;vector<int> v;
int main() {while (true) {v.clear();cin >> d_Q >> num;//Q是允许的报销额 num是发票张数if (num == 0)return 0;//等于0就直接退出for (int j = 1; j <= num; ++j) {//有几张发票 一张一张的计算int sum = 0;cin >> n; //发票上的物件儿数for (int i = 1; i <= n; ++i) {scanf(" %c:%lf", &type, &d_price);int price = d_price * 100;//转为整数if ((type == 'A' || type == 'B' || type == 'C') && price <= 60000) {//满足四种条件才能相加sum += price;} else {sum = 0;getline(cin, s); //如果有不符合的后面的数据直接当作字符串输入不使用break;//然后直接用下一张发票}}if (sum != 0 && sum <= 100000)v.push_back(sum);}int len = v.size(), Q = d_Q * 100; //v是存放对应金额的容器int *dp;dp = new int[Q + 1];//可以用变量来声明大小for (int i = 0; i <= Q; ++i) {dp[i] = 0;}for (int i = 0; i < len; ++i) {for (int j = Q; j >= 1; --j) {if (v[i] <= j) { //可以放进去dp[j] = max(dp[j], dp[j - v[i]] + v[i]);;}}}printf("%.2lf\n", dp[Q] / 100.0);delete[] dp;//释放一组内存}
}
AC代码2
//最大报销额
#include <bits/stdc++.h>
using namespace std;
int arr[50];int main() {double Q, price;int N, d_price;char c;//代表发票的种类while (cin >> Q >> N, N != 0) {int max_ = 0;int len = 1;memset(arr, 0, sizeof(arr));int d_Q = Q * 100; //0 1背包问题要遍历Qfor (int s = 0; s < N; ++s) {int sum = 0;int num;//这是每张发票里面的物品数cin >> num;for (int j = 0; j < num; ++j) {scanf(" %c:%lf", &c, &price);//cout << c << " " << price << endl;d_price = price * 100;if ((c == 'A' || c == 'B' || c == 'C') && d_price <= 60000) {sum += d_price;} else {sum = 0;break;}}if (sum != 0 && sum <= 100000)arr[len++] = sum;}int *dp;dp = new int [d_Q + 1];//开始dpfor (int k = 0; k < d_Q; ++k) {dp[k] = 0;}for (int i = 1; i <= len; ++i) {for (int j = d_Q; j >= arr[i]; --j) {dp[j] = max(dp[j], dp[j - arr[i]] + arr[i]);max_ = max(max_, dp[j]);}}printf("%.2lf\n", max_ / 100.0);delete[] dp;}
}
new与delete
C++使用了new与delete来操控内存的释放问题。比C语言的malloc/alloc/realloc和free更好用,可以对类对象调用初始化构造函数或者销毁析构函数。(在堆存储区,向操作系统申请内存)申请完内存后,要用delete还给操作系统,不能一直占据。
由于静态数组的大小只能是常量,不能是变量,在做一些题的时候并不是十分方便,所以我们会使用动态数组来定义符合自己需要长度的数组,这时的动态数组是支持变量来定义大小的。只是我们需要用指针来定义它,要手动来释放它、手动来初始化它内部的值。
但是在DevC++中,我们可以使用变量来声明一个静态数组,在vs code中却不行,也挺玄乎的喔~
所以还是好好地规范使用new与delete吧。
hun暑期实训 最大报销额(01背包) 关于动态内存分配的new与delete相关推荐
- HDU1864 最大报销额 01背包
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Prob ...
- HDU - 最大报销额(01背包|贪心)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1864 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...
- hdu 1864 最大报销额01背包dp
最大报销额 Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Subm ...
- hdu1864最大报销额 (01背包)
Problem Description 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品 ...
- hun 暑期实训之打牌 cin与scanf的输入
文章目录 题目 思路 AC代码 关于cin与scanf的输入问题 题目 思路 就不断模拟就好了.用一个map存每个字符对应的个数.对于输入的字符串按照长度来区分两种情况,因为当长度为5的时候比较复杂. ...
- 【百家稷学】深度学习计算机视觉生产实习(山西农业大学暑期实训)
继续咱们百家稷学专题,本次是有三AI在山西农业大学开设的为期10天的正式暑期专业课程.百家稷学专题的目标,是走进100所高校和企业进行学习与分享. 本次主题 本次实训是在山西农业大学进行,主题是< ...
- 暑期实训总结_李小倩
暑期实训总结 姓名:李小倩 学号:111307105 班级:CSDN-java班 年级:2011级 转眼间实训已经结束有些时间了,我想这个实训对于我们参与的每一个人来说都是一段美好快乐的记忆.记得距 ...
- 暑期实训心得及总结_史国旭
暑期实训心得及总结 姓名:史国旭 学号:111307168 班级:CSDN-java 年级:2011级 转眼间实训已经结束4天了,我想这个实训对于我们参与的每 ...
- 计算机暑期实训报告,计算机专业暑期实训报告总结范文
<计算机专业暑期实训报告总结范文>由会员分享,可在线阅读,更多相关<计算机专业暑期实训报告总结范文(4页珍藏版)>请在人人文库网上搜索. 1.计算机专业暑期实训报告总结范文 计 ...
最新文章
- 记录 之 numpy查看数据类型和类型转换
- Java SE 8新特性导览:使用Lambda Expression进行函数式编程
- 远控免杀专题(21)-HERCULES免杀
- QT Linux打包发布
- Eclipse自动补全功能轻松设置 || 不需要修改编辑任何文件
- 深度学习环境搭建之Anaconda安装keras
- 7-114 吉老师的回归 (15 分)
- 用Bi-GRU语义解析,实现中文人物关系分析 | 附完整代码
- 外星人台式电脑_2020年双11:高端电竞游戏笔记本电脑本推荐:联想、惠普、雷神、ROG、外星人等品牌游戏本挑选指南...
- Java面向对象㈡ -- 继承与多态
- atitit.添加win 系统服务 bat批处理程序服务的法总结instsrv srvany java linux
- vision里面pt与字号大小对应关系
- 初使用tbs的x5内核所遇到的坑,初学者如何第一次跑起x5内核
- 计算机图形图像学研究,计算机图形学与图形图像处理技术
- 基于STM32的AT24C08数据读写
- javascript中正则匹配多个条件, 常用正则匹配, 正则详解
- python实现明星专家系统:人脸识别自动比对
- ts快捷键 vscode_vscode这篇就够了
- 实验室装水的容器叫什么_实验室常见的水的种类
- 无法加载SQLite.Interop.dll:找不到指定模块