题意:被坑惨,单项不能超过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. 如何升级一个JavaWeb应用

    准备db变更 准备整个war包或变更的文件 上传文件至云盘​(通常直接上传文件较慢,建议先传到云盘,然后下载) 从云盘下载 执行db变更 解压war到指定目录或替换变更的文件 修改设计IP地址的配置文 ...

  2. OVN学习(一)

    参考文档 OVN学习系列参考博文 部署OVN实验环境 网络拓扑 ### Central节点 # cat ifcfg-ens3 TYPE=Ethernet BOOTPROTO=static DEFROU ...

  3. wordcount作业

    搭档:201631062427,201631062627 代码地址:https://gitee.com/oyyyyyy/wordcount 作业地址: 一: 代码互审情况 我们采用的都是c语言的方式完 ...

  4. hihoweek 137(简单完全背包)

    题目链接:http://hihocoder.com/contest/hiho137/problem/1 题意:中文题诶- 思路:各层的成本计算不会有影响,所以我们只要把没一层的成本计算出来在求和就是答 ...

  5. jsp学习与提高(五)——JSP 异常处理

    JSP 异常处理 当编写JSP程序的时候,程序员可能会遗漏一些BUG,这些BUG可能会出现在程序的任何地方.JSP代码中通常有以下几类异常: 检查型异常:检查型异常就是一个典型的用户错误或者一个程序员 ...

  6. thinkphp5修改入口文件位置及相应的问题

    问题1:thinkphp5修改入口文件 解决:参考手册 http://www.kancloud.cn/manual/thinkphp5/129746,然后需要把.htaccess跟入口文件放到同一目录 ...

  7. SQL 主键

    主键: 1.任意两行都不具有的相同的主键值 2.没一列都必须有一个主键值(主键列不允许NULL值) 3.主键列中的值不允许修改或更新 4.主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行 ...

  8. ssrf漏洞分析

    ssrf漏洞分析 关于ssrf 首先简单的说一下我理解的ssrf,大概就是服务器会响应用户的url请求,但是没有做好过滤和限制,导致可以攻击内网. ssrf常见漏洞代码 首先有三个常见的容易造成ssr ...

  9. HDU-1845-Jimmy's Assignment

    链接:https://vjudge.net/problem/HDU-1845 题意: 给一个有向图,求最大匹配. 思路: 有相图的最大匹配,可以通过加上反向边, 求这个无向图的最大匹配, 原图的最大匹 ...

  10. POJ-3177-RedundantPaths(边联通分量,缩点)

    链接:https://vjudge.net/problem/POJ-3177#author=Dillydally 题意: 有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可 ...