• hdoj


    Problem Description
    现有一笔经费可以报销一定额度的发票。允许报销的发票类型包括买图书(A类)、文具(B类)、差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元。现请你编写程序,在给出的一堆发票中找出可以报销的、不超过给定额度的最大报销额。
     
    Input
    测试输入包含若干测试用例。每个测试用例的第1行包含两个正数 Q 和 N,其中 Q 是给定的报销额度,N(<=30)是发票张数。随后是 N 行输入,每行的格式为:
    m Type_1:price_1 Type_2:price_2 ... Type_m:price_m
    其中正整数 m 是这张发票上所开物品的件数,Type_i 和 price_i 是第 i 项物品的种类和价值。物品种类用一个大写英文字母表示。当N为0时,全部输入结束,相应的结果不要输出。
     
    Output
    对每个测试用例输出1行,即可以报销的最大数额,精确到小数点后2位。
     
    Sample Input
    200.00 3 2 A:23.50 B:100.00 1 C:650.00 3 A:59.99 A:120.00 X:10.00 1200.00 2 2 B:600.00 A:400.00 1 C:200.50 1200.50 3 2 B:600.00 A:400.00 1 C:200.50 1 A:100.00 100.00 0
     
    Sample Output
    123.50 1000.00 1200.50

     题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1864

    题目中给的数据是浮点型,背包问题处理的是整形数据,所以先*100将其转化为整形。

    题目的输入数据比较复杂,我门需要先选出符合要求的发票,然后就是在符合要求的发票中选取一些发票,使得总金额最接近给的金额。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    
    using namespace std;
    
    int dp[3000005];
    int a[3000005];
    int main()
    {
        int n;
        double q;
        while(scanf("%lf %d",&q,&n) && n != 0)
        {
            int m;
    
            int num = 0;
            int maxx=(int)(q*100);
            for(int i = 0;i<n;i++)
            {
                scanf("%d",&m);
                char tc;
                double pi;
                double va,vb,vc;
                va =vb =vc = 0;
                int biaoji=1;
                for(int j = 0;j<m;j++)
                {
                    scanf(" %c:%lf",&tc,&pi);
                    if(tc == 'A')
                    {
                        va = va + pi;
                    }else if(tc == 'B')
                    {
                        vb = vb + pi;
                    }else if(tc == 'C')
                    {
                        vc = vc + pi;
                    }else
                    {
                        biaoji = 0;
                    }
                }
                if(biaoji==1 && va<=600 && vb<=600 && vc<=600 && va+vb+vc<=1000)
                {
                    a[num] = (int)((va+vb+vc)*100);
                    num++;
                }
            }
            memset(dp,0,sizeof(dp));
            for(int i = 0;i<num;i++)
            {
                for(int j = maxx;j>=a[i];j--)
                {
                    dp[j] = max(dp[j],dp[j-a[i]]+a[i]);
                }
            }
            printf("%.2lf
    ",(dp[maxx])/100.0);
            
        }
        return 0;
    }
  • 相关阅读:
    从原理上理解NodeJS的适用场景
    core 基本操作
    SQL Server 触发器
    Centos 7 Apache .netcore 做转发
    Windows Server 使用 WAMP 并配置 Https
    centos7 apache php git pull
    Visual StudioTools for Unity 使用技巧2
    如何实现Windows Phone代码与Unity相互通信(直接调用)
    关于NGUI与原生2D混用相互遮盖的问题心得
    关于NGUI制作图集在低内存设备上的注意事项
  • 原文地址:https://www.cnblogs.com/hdyss/p/10853563.html
Copyright © 2020-2023  润新知