zoukankan      html  css  js  c++  java
  • HDU -1864最大报销额(01背包)

    这道题属于简单的01背包,但是背包问题还算简单,就是前面的细节处理的时候要注意,题意大致说了三条限制吧

    1. 只有a, b, c 三种类型的发票可以报销,其它的一律不报销

    2. 物品单项的报销额不超过600

    3. 每个发票总额不超过1000

    有了这三个,还有一个要小心的就是报销额可以为浮点数,所以这里有个小技巧,就是将它乘100,到最后再除以100, 为什么要乘100呢, 因为最后要求保留两位小数

    代码如下:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 
     6 int dp[3000050];//发票张数30*每张总额1000*放大倍数100 = 3000000
     7 int main()
     8 {
     9     char ch;
    10     double x, y;
    11     int sum, a, b, c, money[35], t;
    12     int n, k;
    13     while (~scanf("%lf %d", &x, &n) && n)
    14     {
    15         sum = (int)(x * 100);//将背包的容量放大为整数(这里就是报销的最大值)
    16         memset(dp, 0, sizeof(dp));
    17         memset(money, 0, sizeof(money));
    18         int len = 0;//可报销的列表长度,也就是最后的n
    19         for (int i = 0; i < n; i++)
    20         {
    21             scanf("%d", &k);
    22             a = b = c = 0;//分别来保存a类型,b类型,c类型
    23             bool flag = true;
    24             while (k--)
    25             {
    26                 scanf(" %c:%lf", &ch, &y);
    27                 t = (int)(y * 100);
    28                 if (ch == 'A' && a + t <= 60000)
    29                     a += t;
    30                 else if (ch == 'B' && b + t <= 60000)
    31                     b += t;
    32                 else if (ch == 'C' && c + t <= 60000)
    33                     b += t;
    34                 else
    35                     flag = false;
    36 
    37             }
    38             if (a + b + c <= 100000 && a <= 60000 && b <= 60000 && c <= 60000 && flag)
    39                 money[len++] = a + b + c;//如果满足以上三个条件
    40         }
    41         for (int i = 0; i < len; i++)//01背包核心代码
    42         {
    43             for (int j = sum; j >= money[i]; j--)
    44                 if (dp[j] < dp[j - money[i]] + money[i])
    45                     dp[j] = dp[j - money[i]] + money[i];
    46         }
    47         printf("%.2f
    ", (dp[sum]/100.0));
    48     }
    49     return 0;
    50 }
  • 相关阅读:
    thinkphp 5 隐藏index.php
    jquery ajax参数
    图标字的使用方法
    jquery监听浏览宽度
    手机屏幕的宽度自动适应
    前站常用代码
    服务消费者(Feign-上)
    服务消费者(Ribbon)
    注册中心(Eureka/Consul)
    JDK8 日期格式化
  • 原文地址:https://www.cnblogs.com/Howe-Young/p/4156203.html
Copyright © 2011-2022 走看看