ZCMU-1400-给报销吗

本文介绍了一种算法设计,用于解决在给定额度内寻找最大可报销金额的问题。该算法通过01背包问题的方法处理发票,确保每张发票上的商品总价不超过1000元且单一商品不超过600元,只允许A、B、C三类商品。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1400: 给报销吗

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 65   Solved: 11
[ Submit][ Status][ Web Board]

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
1 200.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
【解析】
其实这道题就是问我们在有限定的额度下能报销的最大额度是多少,每一张发票要报销的话要满足这些情况,一就是
同一类的商品不能 超过600元,一张发票上最多只能是1000元,而且只能有A、B、C类商品。这道题因为有小数点,经
过看别人的做法原 来可以将它放大这样就会比较好做。然后再用01背包来做怎么在这个容量下能尽可能多的去报销。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int f[3000001];
int main()
{
  double Q,p;
  int n,m,k,i,g,r,t,y,flag,len,j;
  char c;
  int a[110];
  while(~scanf("%lf%d",&Q,&n))//输入限定的额度和有几件物品
  {
      if(n==0)
        break;
        memset(a,0,sizeof(a));
        memset(f,0,sizeof(f));
        len=0;
      m=(int)(Q*100);
      for(i=0;i<n;i++)
      {
          scanf("%d",&k);
          r=0,t=0,y=0;
          flag=0;
        while(k--)
        {
         scanf(" %c:%lf",&c,&p);
         g=(int)(p*100);
        if(c=='A'&&r+g<=60000)
        {
                r+=g;//判断同一类商品是不是超过了600元
        }
        else if(c=='B'&&t+g<=60000)
        {
                t+=g;
        }
        else if(c=='C'&&y+g<=60000)
        {
                y+=g;
        }
        else
        {
            flag=1;//如果超过了或者有其他不属于A,B,C的商品那就标记下表示此发票不可以报销
        }

        }
        if(r+t+y<=100000&&flag==0)
        {
            a[len++]=r+t+y;//加入这个数组当中这张发票可以报销
        }
      }
      for(i=0;i<len;i++)
      {
          for(j=m;j>=a[i];j--)
          {
              f[j]=max(f[j],f[j-a[i]]+a[i]);//求最大报销额度
          }
      }
      Q=f[m]*1.0/100;
      printf("%.2f\n",Q);
  }
   return 0;
}

<think>好的,用户想查询ZCMU OJ 1318的题目详情或解题方法。首先,我需要确认自己是否了解这个题目。由于ZCMU OJ的题目可能不在我的训练数据中,我需要根据现有的引用信息进行推断,或者给出一般性的建议。 查看用户提供的引用,发现引用1提到了1614题涉及字符串替换和大小写处理,引用2是1489题关于数气球,引用3是1900题关于并查集的应用。这些信息可能帮助用户解决类似问题,但用户明确询问的是1318题,因此需要处理这个具体的问题。 首先,我需要检查是否有关于1318题的引用,但用户给出的引用中并没有直接提到1318。因此,可能需要建议用户通过题目编号查找或根据常见题型推测。例如,ZCMU的题目可能涉及数据结构、算法或字符串处理等。考虑到引用中的其他题目涉及字符串处理和并查集,1318可能属于类似类型。 接下来,我应该建议用户检查题目链接或提供更多细节,比如题目描述或输入输出样例,以便更准确地分析。同时,可以给出常见的解题思路,比如字符串处理、动态规划或图论算法,并参考现有引用中的类似题目,如字符串处理要注意大小写(引用1),数气球可能涉及计数或哈希表(引用2),并查集用于处理连通性问题(引用3)。 如果用户无法提供更多信息,可以建议搜索ZCMU OJ的在线资源或论坛,比如官方网站、GitHub题解或相关讨论区。此外,提供通用的解题步骤,如分析输入输出、确定算法、处理边界情况等,可能对用户有帮助。 最后,生成相关问题,引导用户进一步提问或提供更多细节,以便更精准地解答。</think>根据现有资料,ZCMU OJ 1318的具体题目内容未在提供的引用中直接提及。以下是帮助您解决此类编程题目的通用方法及建议: ### 常见解题思路(适用于ZCMU OJ题型) 1. **字符串处理** 若涉及字符串操作(如引用[^1]中1614题的替换和大小写处理): ```python # 示例:字符串替换时保留大小写标记 original = "HelloWorld" positions = [0 if c.isupper() else 1 for c in original] # 记录大小写位置 modified = original.lower().replace("world", "Python") result = "".join([c.upper() if positions[i]==0 else c for i,c in enumerate(modified)]) ``` 2. **并查集应用** 若涉及连通性问题(如引用[^3]中1900题的多米诺骨牌): ```python class UnionFind: def __init__(self, n): self.parent = list(range(n+1)) def find(self, x): if self.parent[x] != x: self.parent[x] = self.find(self.parent[x]) return self.parent[x] def union(self, x, y): self.parent[self.find(y)] = self.find(x) ``` 3. **计数与统计** 若涉及数值统计(如引用[^2]中1489题的气球计数): ```python from collections import defaultdict def count_balloons(arr): counter = defaultdict(int) for num in arr: counter[num] += 1 return max(counter.values()) if counter else 0 ``` ### 建议步骤 1. **获取题目描述** 访问ZCMU OJ官网或通过题目编号搜索获取1318题的输入输出样例及具体要求。 2. **分析问题类型** - 若涉及字符串:注意大小写处理、特殊符号过滤 - 若涉及数学:推导公式或使用动态规划 - 若涉及图论:构建邻接表或应用DFS/BFS 3. **参考相似题目** 如引用的字符串替换题需额外记录大小写位置,这种技巧可推广到其他需要保留原始格式的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值