HDU-1864-最大报销额

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=1864

这题开始题意没搞清楚,就做题了,导致浪费了很多的时间,不应该啊,

注意事项:每张发票上,单项物品的价值不得超过600元,这里要小心,就是说    2  A:450  A:200  这张票是不能报销的  它为650了,

开始我没想到他会有这样的数据,这次还犯了一个低级错误,dp竟然没有初始化,这样的错误不能犯啊!

还有对于小数的处理我是直接乘以100的, 不知哪位高人有更好的办法,还请多多指点,

代码

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

int dp[3000005];

int main(void)
{
int i,j,k;
double q,s,s1,s2,s3;
int n,m;
char c;
double p;
int v[35];
while(scanf("%lf%d",&q,&n)==2&&n)
{
k=0;
memset(dp,0,sizeof(dp));
int q1=q*100;
for(i=0;i<n;i++)
{
int ok=0;
s=0; s1=0; s2=0; s3=0;
scanf("%d",&m);
for(j=0;j<m;j++)
{
getchar();
scanf("%c:%lf",&c,&p);
if(c==‘A‘)
{
s1=s1+p;
}
else if(c==‘B‘)
{
s2=s2+p;
}
else if(c==‘C‘)
{
s3=s3+p;
}
else
{
ok=1;
break;
}
}
s=s1+s2+s3;
if(s1<=600&&s2<=600&&s3<=600&&s<=1000&&ok==0)
{
v[k++]=s*100;
}
}
for(i=0;i<k;i++)
{
for(j=q1;j>=v[i];j--)
{
dp[j]=max(dp[j],dp[j-v[i]]+v[i]);
}
}
printf("%.2lf\n",(double)dp[q1]/100);
}
return 0;
}

参数
234MS 12100K 1397 B

时间: 2024-10-12 14:59:52

HDU-1864-最大报销额的相关文章

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

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

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

最大报销额 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 16644    Accepted Submission(s): 4858 Problem Description 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价

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

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

hdu 1864 最大报销额 DP

最大报销额 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 17244    Accepted Submission(s): 5046 Problem Description 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的

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

题意:现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元.现请你编写程序,在给出的一堆发票中找出可以报销的.不超过给定额度的最大报销额. 分析:dp[i]---截止到第i张发票可得到的最大报销额. #include<cstdio> #include<cstring> #include<cstdlib> #include<cctype&

hdu 1864 最大报销额(背包)

最大报销额 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 24020    Accepted Submission(s): 7325 Problem Description 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价

hdu 1864 最大报销额【01背包】

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

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>

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

题意:中文题,你懂得. 析:拿过题目一看,本来以为是贪心,仔细一看不是贪心,其实是一个简单的01背包问题(DP),不过这个题的坑是在处理发票上,刚开始WA了一次. 分析一下什么样的发票是不符合要求的: 1.某一种物品的和超过了600元,注意一定是和,因为有的物品出数据时故意分开了,这是一个坑. 2.发票中含有除ABC这三类的发票是不符合的. 3.发票中总额超过了1000元也是不符合的. 只要处理好上面这三点,AC就小意思了.剩下的就是一个01背包,相当于让你求最大的价值. 有点小技巧,因为是浮点

hdu 1864 最大报销额 模型为简单的01背包

很简单的01背包,但是题目还是很蛋疼的注意题目中600,和1000这两个数,还有就是double和int的转换,1A了感觉还是不错的 /************************************************************************* > File Name: hdu1864.cpp > Author: yang > Mail:[email protected] > Created Time: 2014年08月23日 星期六 14:0