题意:被坑惨,单项不能超过600,其实是一张发票上A类/B类/C类的总和分别不能超过600。

思路:此题的数据很烂。用贪心也能过,用01背包也可以。都测试不出到底那些是错的。

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
using namespace std;
const int N=; //发票张数
double money;
int num,t;
int A,B,C;
double tick[N]; int cmp(double a, double b)
{
return a>b?:;
}
void packet()
{
double ans=;
sort(tick, tick+t, cmp);
for(int i=; i<=t; i++)
{
if(money>=tick[i])
{
ans+=tick[i];
money-=tick[i];
} }
printf("%.2lf\n",ans); } int main()
{
freopen("input.txt","r",stdin); int n,flag,u;
double cnt=, pri; //只是用于计算每张发票总和
char c,tmp; while(cin>>money>>num&&num)
{
t=;
memset(tick, , sizeof(tick)); for(int i=; i<num; i++) //发票
{
flag=;cnt=;A=B=C=; cin>>n;
for(int j=; j<n; j++) //发票项
{
cin>>c>>tmp>>pri;
cnt+=pri; if(c=='A')
A+=pri;
else if(c=='B')
B+=pri;
else if(c=='C')
C+=pri;
else
flag=;
}
if( !flag || cnt> || A> || B> || C> )
continue;
else
tick[t++]=cnt; }
//以上都是输入的,重点在这个函数而已
packet();
}
return ;
}

贪心

我觉得贪心应该不能过的,比如有数据:

1001.5 4
1 A:500
1 C:400
1 A:300
1 B:200

贪心的结果是900,而正确答案是1000=500+300+200.。神奇的是AC了。

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
const int N=; //发票张数
double money;
double dp[];
double tick[N];
int num,t,A,B,C; void packet()
{
for(int i=; i<t; i++)
{
for(int j=ceil(money); ((double)j)-tick[i]>=money-floor(money); j--)//直接用向上取整来决定背包容量
{
double tmp = j-tick[i]; //还能放的容量
if( dp[int(ceil(tmp))] <= tmp && dp[int(ceil(tmp) )] + tick[i] <= money )
tmp = dp[int(ceil(tmp) )] + tick[i];
else
tmp = dp[int(tmp)] + tick[i]; dp[j]= max( tmp , dp[j] );
}
}
printf("%.2lf\n",dp[(int)ceil(money)]);
} int main()
{
freopen("input.txt","r",stdin);
int n,flag,u;
double cnt=, pri; //只是用于计算每张发票总和
char c,tmp; while(cin>>money>>num&&num)
{
t=;
memset(tick, , sizeof(tick));
memset(dp, , sizeof(dp)); for(int i=; i<num; i++) //发票
{
flag=;cnt=;A=B=C=;
cin>>n;
for(int j=; j<n; j++) //发票项
{
cin>>c>>tmp>>pri;
cnt+=pri;
if(c=='A')
A+=pri;
else if(c=='B')
B+=pri;
else if(c=='C')
C+=pri;
else
flag=;
}
if( !flag || cnt> || A> || B> || C> )
continue;
else
tick[t++]=cnt;
}
packet();
}
return ;
}

限额作为背包容量

这个比上面的精确多了,至少上面的数据能测出正确答案。

HDU 1864 最大报销额(01背包,烂题)的更多相关文章

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

    HDU 1864 最大报销额 0-1背包 题意 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上, ...

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

    这道题属于简单的01背包,但是背包问题还算简单,就是前面的细节处理的时候要注意,题意大致说了三条限制吧 1. 只有a, b, c 三种类型的发票可以报销,其它的一律不报销 2. 物品单项的报销额不超过 ...

  3. hdu 1864 最大报销额 01背包

    Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  4. HDOJ 1864 最大报销额(01背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=1864 最大报销额 Time Limit: 1000/1000 MS (Java/Others)    Memor ...

  5. HDU 1864最大报销额 01背包问题

    B - 最大报销额 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit St ...

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

    题意: 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元.现请你编 ...

  7. 杭店 ACM 1864 最大报销额 01背包

    ![勾选C++才能过 题意: 先规定可以报销一定额度的发票,物品类型有A,B,C,三种.要求每张发票总额不得超过1000元,单项物品不得超过600.求报销的最大额 分析: 先找到合格的发票,然后再挑选 ...

  8. hdu 1864 最大报销额(背包)

    最大报销额 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

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

    题目地址:HDU 1864 刚上来看着挺麻烦的..细致看了看原来好简单好简单...仅仅要去掉一些不符合要求的发票,剩下的就是最简单的背包问题了..对于小数问题,仅仅要*100就变成整数了. 代码例如以 ...

随机推荐

  1. Spring入门第十八课

    Spring AOP AspectJ:Java社区里最完整最流行的AOP框架 在Spring2.0以上的版本中,可以使用基于AspectJ注解或者基于XML配置的AOP 看代码: package lo ...

  2. 利用jQuery实现鼠标滑过整行变色

    在很多网站都有这样的效果,那就是当鼠标放在新闻列表一行上的时候,整行就会变色,虽然使用CSS也能够实现此种功能,但是由于众多浏览器版本对于CSS3并没有良好的支持,所以在当前情况下,使用jQuery实 ...

  3. 【原】spring+springmvc+mybatis整合

    整合框架的代码结构: 最全约束: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&q ...

  4. 数据可视化系列--svg入门基础(一)

    一.前言 1.SVG(Scalable Vector Graphics)可伸缩矢量图形 特点: (1)使用xml格式来定义图形: (2)用来定义web上的使用的矢量图: (3)改变图像尺寸,图片质量不 ...

  5. 51nod1060(反素数&dfs)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1060 题意:中文题诶- 思路: 这里用到了反素数的性质: 对 ...

  6. python接口自动化(三十九)- logger 日志 - 上(超详解)

    简介 Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用.这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP, ...

  7. JDK12下的ArrayList源码解读 与 Vector的对比

    ArrayList源码阅读. //测试代码实现如下 private static void arrayList() { ArrayList<String> list = new Array ...

  8. 运用html常用标签和css定位等学做模仿百度导航页面

    导航部分文字链接,鼠标触碰变颜色,除百度logo引用图片外,其它均代码编写.注释部分是一开始用的百度一下截图做的按钮,后来用div填充颜色写了一个按钮.效果图如下. HTML代码如下: <!DO ...

  9. SQL SERVER Study

    1. SQL SERVER Install    可以免费试用天.最新的是2014版本.   2. Attach, Detach 可以添加或去掉已有的数据库文件.     数据库文件的格式是: .md ...

  10. Announcing .NET Core 2.1

    Announcing .NET Core 2.1 https://blogs.msdn.microsoft.com/dotnet/2018/05/30/announcing-net-core-2-1/ ...