题目
hdu1864
思路:
因为金额是小数,所以可以金额 *100 再dp,输出的时候 / 100.0就可以了。
ps:这种题目竟然不告诉报销额Q的取值范围,有点坑😓,开一个3000000大小的数组(4000000可能会MLE)
代码
#include <bits/stdc++.h>
#define DEBUG freopen("_in.txt", "r", stdin); freopen("_out1.txt", "w", stdout);
using namespace std;
const int MAXN = 40;
const int MAXQ = 3e6 + 10;
int a[MAXN], dp[MAXQ];
void solve(double money, int n){
int m, tot = 0;
char type;
double temp;
for (int i = 0; i < n; i++){
scanf("%d", &m);
double A = 0, B = 0, C = 0;
bool ac = true;
while (m--){
scanf(" %c:%lf", &type, &temp);
if (type == 'A')
A += temp;
else if (type == 'B')
B += temp;
else if (type == 'C')
C += temp;
else
ac = false;
}
if (ac && A <= 600 && B <= 600 && C <= 600 && A + B + C <= 1000)
a[tot++] = (A + B + C) * 100;
}
int Q = money * 100;
memset(dp, 0, sizeof(int) * (Q + 5));
for (int i = 0; i < tot; i++)
for (int j = Q; j >= a[i]; j--)
dp[j] = max(dp[j], dp[j-a[i]] + a[i]);
printf("%.2lf\n", dp[Q] / 100.0);
}
int main(){
double money;
int n;
while (~scanf("%lf%d", &money, &n) && n != 0)
solve(money, n);
return 0;
}