标签:题意 最大 || math while == long 处理 const
现有一笔经费可以报销一定额度的发票。允许报销的发票类型包括买图书(A类)、文具(B类)、差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元。现请你编写程序,在给出的一堆发票中找出可以报销的、不超过给定额度的最大报销额。
先处理输入,出现不能报销的种类直接不加入A数组。
同时注意,发票上的单个种类可能分多次显示。
同时将值乘100用来去除小数。
#include <iostream>
#include <memory.h>
#include <vector>
#include <map>
#include <algorithm>
#include <cstdio>
#include <math.h>
using namespace std;
typedef long long LL;
const int MAXN = 30 + 10;
int dp[MAXN * 1000 * 100];
int A[MAXN];
int main()
{
double q;
int v, n;
while (~scanf("%lf%d", &q, &n))
{
memset(dp, 0, sizeof(dp));
if (!n)
break;
v = (int)(q * 100);
int cnt = 0;
for (int i = 1;i <= n;i++)
{
int t;
int a, b, c;
a = b = c = 0;
double cost;
char type;
int flag = 1;
scanf("%d", &t);
for (int j = 1;j <= t;j++)
{
scanf(" %c:%lf", &type, &cost);
if (type != ‘A‘ && type != ‘B‘ && type != ‘C‘)
flag = 0;
if (type == ‘A‘)
a += (int)(cost * 100);
if (type == ‘B‘)
b += (int)(cost * 100);
if (type == ‘C‘)
c += (int)(cost * 100);
}
if (a + b + c > 1000 * 100)
flag = 0;
if (a > 600 * 100 || b > 600 * 100 || c > 600 * 100)
flag = 0;
if (flag)
A[++cnt] = a + b + c;
}
for (int i = 1;i <= cnt;i++)
{
for (int j = v;j >= A[i];j--)
dp[j] = max(dp[j], dp[j - A[i]] + A[i]);
}
printf("%.2lf\n", dp[v] / 100.0);
}
return 0;
}
标签:题意 最大 || math while == long 处理 const
原文地址:https://www.cnblogs.com/YDDDD/p/10465563.html