HDU 1864 最大报销额 01背包

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

HDU 1864 最大报销额

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 17530    Accepted Submission(s): 5141


Problem Description
现有一笔经费可以报销一定额度的发票。允许报销的发票类型包括买图书(A类)、文具(B类)、差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元。现请你编写程序,在给出的一堆发票中找出可以报销的、不超过给定额度的最大报销额。
 

Input
测试输入包含若干测试用例。每个测试用例的第1行包含两个正数 Q 和 N,其中 Q 是给定的报销额度,N(<=30)是发票张数。随后是 N 行输入,每行的格式为:
m Type_1:price_1 Type_2:price_2 ... Type_m:price_m
其中正整数 m 是这张发票上所开物品的件数,Type_i 和 price_i 是第 i 项物品的种类和价值。物品种类用一个大写英文字母表示。当N为0时,全部输入结束,相应的结果不要输出。
 

Output
对每个测试用例输出1行,即可以报销的最大数额,精确到小数点后2位。
 

Sample Input
200.00 3 2 A:23.50 B:100.00 1 C:650.00 3 A:59.99 A:120.00 X:10.00 1200.00 2 2 B:600.00 A:400.00 1 C:200.50 1200.50 3 2 B:600.00 A:400.00 1 C:200.50 1 A:100.00 100.00 0
 

Sample Output
123.50 1000.00 1200.50
 

简单的01背包 不过写完了才发现空间可以优化 - - 用bool来表示是否可以报销 找到最大值即可

需要注意的就是用%c读入的时候 - - 要先吃掉缓冲区的换行 一直没觉得题目说的2位精度是说所有的都是2位小数 

-3- 不过看大家都这么写 看来题意就是这个意思了

这样的话 直接*100 换成整数就好了 - -

AC代码如下 - - 

//
//  HDU 1864 最大报销额
//
//  Created by TaoSama on 2015-02-06
//  Copyright (c) 2014 TaoSama. All rights reserved.
//
#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <string>
#include <set>
#include <vector>
#define CLR(x) memset(x, 0, sizeof(x))

using namespace std;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int N = 1e5 + 10;

int n, sum, dp[3500000], v[35]; //dp[j]表示报销当前额度的最大值 //其实也可以用bool来判断是否可报销
double q;

int main() {
#ifdef LOCAL
	freopen("in.txt", "r", stdin);
//	freopen("out.txt","w",stdout);
#endif
	ios_base::sync_with_stdio(0);
	while(scanf("%lf%d", &q, &n) == 2 && n) {
		memset(dp,0,sizeof dp);
		sum = q * 100; int ct = 0;
		for(int i = 1; i <= n; ++i) {
			int m; scanf("%d", &m);
			int a = 0, b = 0, c = 0; bool ok = true;
			while(m--) {
				getchar();
				char op; double x; scanf("%c:%lf", &op, &x); x *= 100;
				if(op == 'A') a += x;
				else if(op == 'B') b += x;
				else if(op == 'C') c += x;
				else ok = false;
			}
			if(a + b + c <= 100000 && a <= 60000 && b <= 60000
			        && c <= 60000 && ok)
				v[++ct] = a + b + c;
			//cout<<v[ct]<<endl;
		}
		for(int i = 1; i <= ct; ++i)
			for(int j = sum; j >= v[i]; --j)
				dp[j] = max(dp[j], dp[j - v[i]] + v[i]);
		printf("%.2f\n", dp[sum] / 100.0);
	}
	return 0;
}




hdu1864 最大报销 01背包 最大报销Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 29672    Accepted Submission(s): 9092Problem Description现有一笔经费可以报销一定度的发票。允许报销的发票类型包括买图书(A类... 阅读详情

相关推荐

HDU 1864 最大报销(01背包)

HDU 1864 最大报销(01背包) http://acm.hdu.edu.cn/showproblem.php?pid=1864 题意:        现有一笔经费可以报销一定度的发票。允许报销的发票类型包括买图书(A类)、文具(B类)、差旅(C类),要求每张发票的总不得超过1000元,每张发票上,单项物品的价值不得超过600元。现请你编写程序,在给出的一堆发票中找出可以报销的、不

code 3254

hdu 1864 01背包 最大报销

http://acm.hdu.edu.cn/showproblem.php?pid=1864 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的选拔 最大报销 Time Limit: 1000/1000 MS (Java/Others)...

179

HDU 1864 最大报销 (01背包)

题目链接:HDU 1864 最大报销 01背包。 把张数当成背包,状态转移方程:f[j]=max(f[j],f[j-1]+v[i]),f[j]表示把j张装进背包最大报销。 这题这么做还是有点问题,比如这组数据: 100.00 5 1 A:5 1 B:20 1 C:24 1 A:30 1 A:60 f[3]为114,f[2]为90,f[3]超过了100.00,那么就会输

fobdddf的专栏 606

HDU 1864最大报销——01背包

最大报销 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 33746 Accepted Submission(s): 10395 Problem Description 现有一笔经费可以报销一定度的发票。允许报销的发票类型包括买...

小橘子的AC之旅 696

hdu 1864 最大报销 01背包变形

Problem Description 现有一笔经费可以报销一定度的发票。允许报销的发票类型包括买图书(A类)、文具(B类)、差旅(C类),要求每张发票的总不得超过1000元,每张发票上,单项物品的价值不得超过600元。现请你编写程序,在给出的一堆发票中找出可以报销的、不超过给定度的最大报销。 Input 测试输入包含若干测试用例。每个测试用例的第1行包含两个正数 Q 和 N,其中 Q 是给定的报销度,N(<=30)是发票张数。随后是 N 行输入,每行的格式为: m Type_1:price

Lionel 1038

HDU1864 最大报销 01背包

HDU1864 最大报销 01背包

qq_44919369的博客 188

最大报销 HDU - 1864DP+01背包

最大报销 HDU - 1864 点击跳转↑ 题设:多组输入,每组输入一对Q和N,分别代表当前的公费,和需要报销的账单总数。接下来N行,每行开始一个m,接下来是m项物品的名称和价格。求:在所有符合报销规则的账单中,任意组合,让总报销不超过公费且最大。 思路:简单的背包,但是有坑,首先需要读懂题意,账单的报销规则为: 1-允许报销的发票类型包括买图书(A类)、文具(B类)、差旅(C类) ==>单张账单中,只能出现“A”,“B”,“C”三种类型的物品 2-每张发票的总不得超过1000元 ==>

自伤无色的博客 538

最大报销 HDU - 186401背包

最大报销 现有一笔经费可以报销一定度的发票。允许报销的发票类型包括买图书(A类)、文具(B类)、差旅(C类),要求每张发票的总不得超过1000元,每张发票上,单项物品的价值不得超过600元。现请你编写程序,在给出的一堆发票中找出可以报销的、不超过给定度的最大报销。 Input 测试输入包含若干测试用例。每个测试用例的第1行包含两个正数 Q 和 N,其中 Q 是给定的报销度,N(...

YOONGI 355

hdu1864 最大报销01背包

最大报销 Time Limit: 1000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10647Accepted Submission(s): 2875 Problem Description 现有一笔经费可以报销一定度的发票。允许报销的发...

angtongyou1893的博客 112

01背包 HDU——1864 最大报销

转化为整数扩大100倍处理 //*为赋值抑制字符,表示本输入项对应的数据 //读入后,不赋给相应的变量 如: //scanf("%2d%*2d%3d",&a,&b); printf("%d\n%d\n",a,b); 输入123456789 //则系统将读取12并赋给a 读取34但舍掉 读取567并赋给b 所以a=12 b=567 //处理好输入后,将值存入f[]中并套用01背包 #

1.3秒前 555

HDU ~ 1864 ~ 最大报销01背包

题目网址:最大报销 最大报销 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 现有一笔经费可以报销一定度的发票。允许报销的发票类型包括买图书(A类)、文具(B类)、差旅(C类),要求每张发票的总不得超过1000元,每

张松超的博客 468

HDU - 1864 最大报销01背包

题目链接: [最大报销] 大致题意: 给一些发票,每张发票都有一个报销,每张发票还有一个判断合不合法的过程,它要求的是每张发票上的A,B,C每类都不大于,每张发票要么全报要么全不报。问你在总报销不大于Q的情况下最大的总报销是多少 解题思路: 假设每张发票的重量都是1,背包容量就是发票的张数 只要从大到小枚举张数就好了,碰见第一个不大于Q的值就是答案 AC代码: #include <bits/stdc++.h> typedef long long ll; using namespac

qq_49494204的博客 229

[HDU - 1864] 最大报销 (01背包)

链接 http://acm.hdu.edu.cn/showproblem.php?pid=1864 题意 总共有nnn张发票,你需要去报销它们,但是有报销度;每张发票给出了购买物品类型,以及对应消费价格,可以报销的发票为,购买物品只能包含A、B、CA、B、CA、B、C,并且每种物品消费不得超过600600600,总消费价格不得高于100010001000,问最多可以报销多少; 分析   显然我...

梧桐 273

HDU1864 最大报销01背包

最大报销 Time Limit: 1000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 32784Accepted Submission(s): 10115 Problem Description 现有一笔经费可以报销一定度的发票。允许报销的发票...

逐梦者 303

HDU 1864 最大报销(dfs和01背包都可以)

最大报销 Problem Description 现有一笔经费可以报销一定度的发票。允许报销的发票类型包括买图书(A类)、文具(B类)、差旅(C类),要求每张发票的总不得超过1000元,每张发票上,单项物品的价值不得超过600元。现请你编写程序,在给出的一堆发票中找出可以报销的、不超过给定度的最大报销。   Input 测试输入包含若干测试用例。每个测试用例的第1行包含

Algobird 540

HDU 1864 最大报销(01背包应用)

最大报销 Time Limit: 1000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9752Accepted Submission(s): 2603 Problem Description 现有一笔经费可以报销一定度的发票...

weixin_30596165的博客 105

HDU -1864最大报销(01背包)

这道题属于简单的01背包,但是背包问题还算简单,就是前面的细节处理的时候要注意,题意大致说了三条限制吧 1. 只有a, b, c 三种类型的发票可以报销,其它的一律不报销 2. 物品单项的报销不超过600 3. 每个发票总不超过1000 有了这三个,还有一个要小心的就是报销可以为浮点数,所以这里有个小技巧,就是将它乘100,到最后再除以100, 为什么要乘100呢, 因为最...

dizhuo0219的博客 132

hdu 1864 最大报销 01背包

http://acm.hdu.edu.cn/showproblem.php?pid=1864

qq_20593067的专栏 322
上一篇: HDU 2955 Robberies 01背包
下一篇: HDU 1231 最大连续子序列
TaoSama
博客等级 码龄15年 89粉丝 457原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值