hdu1864 最大报销额(01背包)

Posted Surprisez

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu1864 最大报销额(01背包)相关的知识,希望对你有一定的参考价值。

https://vjudge.net/problem/HDU-1864

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cstdlib>
 6 #include<cmath> 
 7 #define lson l, m, rt<<1
 8 #define rson m+1, r, rt<<1|1
 9 #define IO ios::sync_with_stdio(false);cin.tie(0);
10 #define INF 1e9
11 typedef long long ll;
12 using namespace std;
13 int n, m, a[1010], dp[5000010];
14 double q, price, v[3];
15 int main()
16 {
17     IO;
18     while(~scanf("%lf%d", &q, &n)){
19         int q1 = q*100;
20         if(n == 0) break;
21         memset(dp, 0, sizeof(dp));
22         memset(a, 0, sizeof(a));
23         int t = 0;
24         char type;
25         for(int j = 0; j < n; j++){
26             scanf("%d", &m);
27             for(int i = 0; i < 3; i++) v[i] = 0;
28             int flag=0;
29             for(int i = 0; i < m; i++){
30                 scanf(" %c:%lf", &type, &price);//一张发票上可能有一个物品的多个记录 
31                 if(type==A||type==B||type==C){
32                     int s = type-A;
33                     v[s] += price;
34                 }
35                 else flag=1;
36             }
37             if(flag) a[t]=0;//有‘X‘ 
38             else if(v[0]+v[1]+v[2]>1000) a[t] = 0;//和超 
39             else if(v[0]>600||v[0]>600||v[0]>600) a[t]=0;//单超 
40             else {
41                 a[t] = (v[0]+v[1]+v[2])*100;
42                 t++;
43             } 
44         }
45         //sort(a, a+n);
46         for(int i = 0; i < t; i++){
47             for(int j = q1; j >= a[i]; j--){
48                 dp[j] = max(dp[j], dp[j-a[i]]+a[i]);
49             }
50         }
51         printf("%.2lf\n", dp[q1]*1.0/100);
52     }
53     return 0;
54 }

 

以上是关于hdu1864 最大报销额(01背包)的主要内容,如果未能解决你的问题,请参考以下文章

HDU1864 最大报销额 01背包

HDU1864_最大报销额(背包/01背包)

hdu1864 最大报销额(01背包)

HDU 1864 最大报销额 (DP-01背包问题)

HDU 1864 最大报销额 0-1背包

hdu 1864 最大报销额(背包)