HDU1864 最大报销额 01背包

非常裸的01背包,水题。注意控制精度

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
const int INF = 1e6;
using namespace std;
int dp[4*INF],cost[5],w[31];
int max(int x,int y)
{
    if(x > y)
        return x;
        else
    return y;
}
int min(int x,int y)
{
    if(x > y)
        return y;
        else
    return x;
}
int main()
{
    double z; int n,zong,m;
    char mm;
    while(~scanf("%lf%d",&z,&n))
    {
        if(n==0) break;
        zong = z * 100; int l = 1;
        memset(w,0,sizeof(w));
        for(int i = 1;i<=n;i++)
        {
            scanf("%d",&m);
            int sum = 0;
            memset(cost,0,sizeof(cost));
            int flag = 1;
            for(int j = 0;j<m;j++)
            {
                scanf(" %c:%lf",&mm,&z);
                if(mm==‘A‘) cost[1] += z * 100;
                else if(mm==‘B‘) cost[2] += z * 100;
                else if(mm==‘C‘) cost[3] += z * 100;
                else  flag = 0;
            }
            if(!flag)
                continue;
            if(cost[1]<=60000 &&cost[2]<=60000 &&cost[3]<=60000)
                sum += cost[1]+cost[2]+cost[3];
            if(sum<=10000000)
            {
                w[l++] = sum;
               // cout<<"w[l]="<<w[l-1]<<endl;
            }
        }
        memset(dp,0,sizeof(dp));
        for(int i = 1;i<=l;i++)
        {
            for(int j = zong;j>=w[i];j--)
            {
                if(dp[j]<dp[j-w[i]]+w[i])
                    dp[j] = dp[j-w[i]]+w[i];
            }
        }
        printf("%.2lf\n",dp[zong]*1.0/100);
    }
    return 0;
}
时间: 2024-10-06 14:08:17

HDU1864 最大报销额 01背包的相关文章

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

这道题属于简单的01背包,但是背包问题还算简单,就是前面的细节处理的时候要注意,题意大致说了三条限制吧 1. 只有a, b, c 三种类型的发票可以报销,其它的一律不报销 2. 物品单项的报销额不超过600 3. 每个发票总额不超过1000 有了这三个,还有一个要小心的就是报销额可以为浮点数,所以这里有个小技巧,就是将它乘100,到最后再除以100, 为什么要乘100呢, 因为最后要求保留两位小数 代码如下: 1 #include <iostream> 2 #include <cstdi

最大报销额 ~01背包

现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元.现请你编写程序,在给出的一堆发票中找出可以报销的.不超过给定额度的最大报销额. Input测试输入包含若干测试用例.每个测试用例的第1行包含两个正数 Q 和 N,其中 Q 是给定的报销额度,N(<=30)是发票张数.随后是 N 行输入,每行的格式为: m Type_1:price_1 Type_2:price_2

HDU 1864 最大报销额(01背包,烂题,不要做)

题意:被坑惨,单项不能超过600,其实是一张发票上A类/B类/C类的总和分别不能超过600. 思路:此题的数据很烂.用贪心也能过,用01背包也可以.这样子就测试不出到底那些是错的. 1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 #include <math.h> 6 #include <algorithm>

hdu1864最大报销额 01

先把小数乘100变成整数然后处理每个发票里面可以报销的 最后自底向上DP #include <stdio.h> #include <algorithm> #include <string.h> using namespace std; int dp[3000050]; int main() { char ch; double x,y; int sum,a,b,c,money[35],v; int t,i,j,k; while(~scanf("%lf%d&quo

hdu 1864最大报销额 (01背包模板)

//注意将价格转化为整数即可 # include <stdio.h> # include <algorithm> # include <string.h> using namespace std; int max(int a,int b) { return a>b?a:b; } int dp[3000050]; int main() { int n,i,j,flag,l,m; int suma,sumb,sumc,sum; double q,p; int cot[

hdu1864 最大报销额(01背包)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1864 Problem Description 现有一笔经费能够报销一定额度的发票.同意报销的发票类型包含买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元.现请你编敲代码,在给出的一堆发票中找出能够报销的.不超过给定额度的最大报销额. Input

01背包水题篇之HDU1864——最大报销额

这个题目好果的01,只要把每个数乘以100,就能解决下标的问题了 继续贴代码环节(自己的代码好丑啊~~~) <span style="font-size:18px;">#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #define maxn 3100000 using namespace std; int dp[maxn]; i

hdu1864 最大报销额

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1864 题目: 最大报销额 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15629    Accepted Submission(s): 4496 Problem Description 现有一笔经费可以报销一定额度的发票.允许报销的发

HDU 1864最大报销额(一维背包)

题目地址:HDU 1864 刚上来看着挺麻烦的..仔细看了看原来好简单好简单...只要去掉一些不符合要求的发票,剩下的就是最简单的背包问题了..对于小数问题,只要*100就变成整数了. 代码如下: #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #inclu