题目
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;
}
本文介绍了一道关于动态规划的问题(hdu1864),解决涉及小数金额报销的场景。通过将金额转换为整数并使用dp方法求解,文章强调了合理数组大小选择的重要性。代码展示了如何处理输入数据并计算最优报销方案。
hdu 1864 最大报销额&spm=1001.2101.3001.5002&articleId=113735544&d=1&t=3&u=038e990e17924eac9e909629049f1d13)
3247

被折叠的 条评论
为什么被折叠?



