HDU 1864 最大报销额 0-1背包
HDU 1864 最大报销额 0-1背包
题意
现有一笔经费可以报销一定额度的发票。允许报销的发票类型包括买图书(A类)、文具(B类)、差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元。现请你编写程序,在给出的一堆发票中找出可以报销的、不超过给定额度的最大报销额。
这里要注意的是,只要总金额大于1000,或者每种类别的总金额大于600,或者这个发票中有其他类别物品,就不能报销
解题思路
这里就是简单的\(0-1\)背包了,主要的就是在于对于数据的预处理方面。
还有一点就是数组下标需要整数,但是这个金额都是浮点数,该怎么办呢?我们发现,这里输入的数据都是保留了小数点后两位,所以我们可以对每个金额\(*100\),这样的话就都是整数了。
一些细节参见代码实现。
代码实现
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=40;
const int maxm=4e5+7;
const int maxq=1000*30*100+7;
double rec[maxn];
double dp[maxq];
double q;
int n, m;
int main()
{
while(scanf("%lf%d", &q, &n) && n!=0)
{
char type;
int flag, cnt=0; //使用cnt来记录实际合法的发票个数
while(n--)
{
double price, va=0, vb=0, vc=0;//总金额,A,B,C类的总金额
flag=1; //一个标记
scanf("%d", &m);
while(m--)
{
scanf(" %c:%lf", &type, &price);
if(flag==0)//如果标记为0的话,说明前面有不合法的数据,这个发票也就作废了
continue;
if(type=='A')
va+=price;
else if(type=='B')
vb+=price;
else if(type=='C')
vc+=price;
else flag=0;
}
//下面会再次进行判断
if(flag==1 && va<=600.0 && vb<=600.0 && vc<=600.0 && (va+vb+vc)<=1000.0)
{
rec[++cnt]=va+vb+vc;
}
}
memset(dp, 0, sizeof(dp));
int max_val=int(q*100);//最大金额化成整数
for(int i=1; i<=cnt; i++)
{
for(int j=max_val; j>=int(rec[i]*100); j--) //每张发票的金额也要化成整数
{
dp[j]=max(dp[j-int(rec[i]*100)]+rec[i], dp[j]);
}
}
printf("%.2lf\n", dp[max_val]);//注意输出格式,要求小数点后两位。
}
return 0;
}
HDU 1864 最大报销额 0-1背包的更多相关文章
- hdu 1864 最大报销额【01背包】
题目链接:https://vjudge.net/problem/HDU-1864 题目大意: 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求 ...
- hdu 1864 最大报销额(01背包)
最大报销额 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU - 1864 最大报销额 (01背包)
题意:现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元.现请你编写 ...
- HDOJ(HDU).1864 最大报销额 (贪心)
HDOJ(HDU).1864 最大报销额 题意分析 题目有点问题,原题中说的 单项物品的价值不得超过600元 应该是单类物品的价值不能超过600元. 一开始以为是01背包,后来按贪心写过了. 一张一张 ...
- HDU -1864最大报销额(01背包)
这道题属于简单的01背包,但是背包问题还算简单,就是前面的细节处理的时候要注意,题意大致说了三条限制吧 1. 只有a, b, c 三种类型的发票可以报销,其它的一律不报销 2. 物品单项的报销额不超过 ...
- hdu 1864 最大报销额(背包)
最大报销额 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU 1864最大报销额(一维背包)
题目地址:HDU 1864 刚上来看着挺麻烦的..细致看了看原来好简单好简单...仅仅要去掉一些不符合要求的发票,剩下的就是最简单的背包问题了..对于小数问题,仅仅要*100就变成整数了. 代码例如以 ...
- hdu 1864 最大报销额 01背包
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...
- HDU - 1864 最大报销额 (背包)
题意: 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元.现请你编 ...
随机推荐
- VMWare虚拟机启动不了有个叉叉的解决办法
打开VMWare虚拟机提示有: This virtual machine appears to be in use. If this virtual machine is already in use ...
- 基于STM32的CRC校验说明
///***************************************************************************** //下面是test.c里面的函数 // ...
- 微信点餐系统(七)-微信授权获取openid:
章节小结: 1.学会了微信授权的步骤,学会了微信授权的文档 2.学会了使用natapp内网穿透工具 3.加深了虚拟机的网络配置以及基本使用 4.学会了抓包购票工具fiddler的使用 5.微信授权步骤 ...
- const与#define的区别
1.const (1)为什么需要const成员函数? C中常用:“ #define 变量名 变量值”定义一个值替代,然而却有个致命缺点:缺乏类型检测机制,这样预处理在C++中成为可能引发错误的隐患,于 ...
- Spring Data Jpa (四)注解式查询方法
详细讲解声明式的查询方法 1 @Query详解 使用命名查询为实体声明查询是一种有效的方法,对于少量查询很有效.一般只需要关心@Query里面的value和nativeQuery的值.使用声明式JPQ ...
- wannafly 练习赛10 E 数列查找(莫队+分块分块分块......)
链接:https://www.nowcoder.net/acm/contest/58/E 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit ...
- [CSP-S模拟测试]:Cicada拿衣服(暴力+乱搞)
题目传送门(内部题94) 输入格式 第一行两个整数$n,k$,代表衣服的数量和阈值. 接下来一行$n$个数,第$i$个数$a_i$表示每件衣服的愉悦值. 输出格式 输出一行$n$个数,第$i$个数为$ ...
- shell脚本之浮点数和整数计算
整数计算 直接使用放括号计算即可,省去*号需要使用转义符的麻烦 #!/bin/bash num1= num2= var1=$[ $num1 * $num2 ] echo "$var1&quo ...
- Array Stack Implement using C
- leetcode-mid-sorting and searching-75. Sort Colors-NO
mycode 97.95% class Solution(object): def sortColors(self, nums): """ :type nums: L ...