首页 > 其他分享 >最大报销额

最大报销额

时间:2024-05-16 16:22:35浏览次数:22  
标签:最大 int price 报销 100 type dp

送锚点:https://acm.hdu.edu.cn/showproblem.php?pid=1864

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

思路

将题目所给的价格都乘100,用01背包解决该问题

code

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;

const int maxn = 40;
int dp[maxn * 1000 * 100];
int cost[maxn];//统计可报销的发票金额
int main()
{
	double Q;
	int q,N;	
	while (cin >> Q >> N) {
		int cnt = 0;//统计可报销的发票数量
		if (!N) break;//停止输入
		memset(dp, 0, sizeof(dp));
		memset(cost, 0, sizeof(cost));
		q = (int)(Q * 100);//强制转化,下面一样如此
		for(int i = 1; i <= N;i ++)  {//发票数量
			int m;//物品数
			cin >> m;
			char type, b ;
			double Price;
			bool flag = true;
			int pa = 0, pb = 0, pc = 0;//项目A、B、C的价格
			for(int j = 0; j < m;j ++) {
				cin >> type >> b >> Price;
				int price = (int)(Price * 100);
				if (type != 'A' && type != 'B' && type != 'C')
                    flag = false;
				if (type == 'A') {
					pa += price;
				}
				else if (type == 'B') {
					pb += price;
				}
				else if (type == 'C') {
					pc += price;
				}
			}
			if (pa > 600 * 100 || pb > 600 * 100 || pc > 600 * 100) {
				flag = false;
				continue;
			}
			if (pa + pb + pc > 1000 * 100) {
				flag = false;
				continue;
			}
			if (flag) {
				cost[++cnt] = pa + pb + pc;
			}
		}
		for (int i = 1; i <= cnt; i++) {
			for (int j = q; j >= cost[i]; j--) {
				dp[j] = max(dp[j], dp[j - cost[i]]+ cost[i]);
			}
		}
		printf("%.2lf\n", dp[q] / 100.0);
	}
	return 0;
}

标签:最大,int,price,报销,100,type,dp
From: https://www.cnblogs.com/6Luffy6/p/18196159

相关文章

  • P8803 [蓝桥杯 2022 国 B] 费用报销
    P8803[蓝桥杯2022国B]费用报销一、问题简析本题是一道01背包。重点是\(K\)的限制,使我们在取\(a_i\)时,不能无所顾忌地套用模板\(dp_{i-1,j-a_i.worth}+a_i.worth\)。我们必须找到上一张合法的\(a_j\),即\(a_j\)与\(a_i\)之间的日期不小于\(K\)。通过以下步骤确......
  • Python 中寻找列表最大值位置的方法
    前言在Python编程中,经常需要对列表进行操作,其中一个常见的任务是寻找列表中的最大值以及其所在的位置。本文将介绍几种方法来实现这个任务。方法一:使用内置函数max()和index()Python提供了内置函数max()来找到列表中的最大值,同时可以使用index()方法找到该最大值在......
  • P6577 【模板】二分图最大权完美匹配 (KM)
    $\quad$初看就发现不对劲了,模板紫题,一看就不简单,就交了个裸\(KM\),哎,果然\(T\)了。$\quad$然后就是大力卡常(当然\(O(n^4)\))的复杂度不是卡常能解决的。遂看题解,发现一个据说\(O(n^3)\)的复杂度的\(KM\),也是非常抽象。具体解释详见https://www.luogu.com.cn/article/ip2m1gu......
  • 「网络流浅谈」最大流的应用
    二分图匹配考虑如何将二分图匹配问题,转化为流网络。设置\(1\)个汇点和源点,从源点向二分图一侧的每一个点连边,从另一侧向汇点连边,边权均为\(1\),二分图中的边也全部加入,权值设为\(1\)。这样,二分图的最大匹配等于流网络的最大流。P2756飞行员配对方案问题题意:给定\(1\)个二......
  • Leedcode-最大连续 1 的个数
    自己写的:fromtypingimportListclassSolution:deffindMaxConsecutiveOnes(self,nums:List[int])->int:#初始化最大连续1的计数器和临时连续1的计数器count=0temp=0#获取列表长度n=len(nums)#初......
  • 【LeetCode 410】分割数组的最大值
    题目描述原题链接:LeetCode.410分割数组的最大值解题思路分割的是连续子数组,所以模拟分割求子数组之和可以利用前缀和计算;设前缀和数组preSume[i]含义为[0,..,i]范围元素之和,某个子数组subArray[i,j]的元素和就是preSum[j]-preSum[i];求K个子数组元素和的最大值能转换......
  • 100274. 从魔法师身上吸取的最大能量
    在神秘的地牢中,n 个魔法师站成一排。每个魔法师都拥有一个属性,这个属性可以给你提供能量。有些魔法师可能会给你负能量,即从你身上吸取能量。你被施加了一种诅咒,当你从魔法师 i 处吸收能量后,你将被立即传送到魔法师 (i+k) 处。这一过程将重复进行,直到你到达一个不存在 (i......
  • m基于FPGA的MPPT最大功率跟踪算法verilog实现,包含testbench
    1.算法仿真效果其中Vivado2019.2仿真结果如下:   使用matlab进行显示如下:   2.算法涉及理论知识概要       在太阳能光伏系统中,最大功率点跟踪(MaximumPowerPointTracking,MPPT)是提高能量转换效率的关键技术之一。爬山法(HillClimbingAlgorithm,HCA)......
  • 53_Maximum Subarray-最大子数组
    问题描述Givenanintegerarray nums,findthe subarray withthelargestsum,andreturn itssum.给定一个数组nums,找到一个子数组。使它的和最大,返回子数组例子Input:nums=[-2,1,-3,4,-1,2,1,-5,4]Output:6Explanation:子数组[4,-1,2,1]有最大的和6.基......
  • 215. 数组中的第K个最大元素
    给定整数数组nums和整数k,请返回数组中第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。你必须设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:[3,2,1,5,6,4],k=2输出:5示例2:输入:[3,2,3,1,2,4,5,5,6......