B - 最大报销额

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Appoint description:

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
 
 
 
变形的01背包问题,其中,由于dp数组中只能存储整数,所以在处理之前分别乘以100,就可以解决i小树的问题了,解决之后可以在除以100
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=;
double value[maxn];
int dp[];
int tvalue[maxn];
int main(){
double sum;
int n;
while(scanf("%lf%d",&sum,&n)!=EOF){
if(n==)
break;
memset(value,,sizeof(value));
memset(dp,,sizeof(dp));
memset(tvalue,,sizeof(tvalue));
int t;
int cnt=;
char c,c1;
double price,pa,pb,pc;
// pa=0,pb=0,pc=0;
for(int i=;i<=n;i++){
pa=,pb=,pc=;
bool flag=true;
scanf("%d",&t);
for(int j=;j<=t;j++){
getchar();
scanf("%c%c%lf",&c,&c1,&price);
// printf("------?%c\n",c);
if(c!='A'&&c!='B'&&c!='C'){
flag=false; } if(c=='A'){
pa+=price;
}
else if(c=='B'){
pb+=price;
}
else if(c=='C'){
pc+=price;
}
}
double tmp_sum=pa+pb+pc;
if(tmp_sum>||pa>||pb>||pc>)
flag=false;
if(flag){
value[cnt++]=tmp_sum;
}
}
/* printf("----->\n");
for(int i=0;i<cnt;i++)
printf("%lf ",value[i]);*/
int tsum=(int)(sum*);
for(int i=;i<cnt;i++){
tvalue[i]=(int )(value[i]*);
} /* printf("//////////\n");
for(int i=0;i<cnt;i++)
printf("%d ",tvalue[i]);
printf("//////////\n");
*/
int up=;
for(int i=;i<cnt;i++){
up+=tvalue[i];
}
if(up<tsum)
tsum=up;
for(int i=;i<cnt;i++){
for(int j=tsum;j>=tvalue[i];j--){
dp[j]=max(dp[j],dp[j-tvalue[i]]+tvalue[i]);
}
}
double ans=dp[tsum]/100.0;
printf("%.2lf\n",ans);
}
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. HDU 1864 最大报销额 (DP-01背包问题)

    题意:中文题,你懂得. 析:拿过题目一看,本来以为是贪心,仔细一看不是贪心,其实是一个简单的01背包问题(DP),不过这个题的坑是在处理发票上,刚开始WA了一次. 分析一下什么样的发票是不符合要求的: ...

  5. HDU 1864 最大报销额(01背包,烂题)

    题意:被坑惨,单项不能超过600,其实是一张发票上A类/B类/C类的总和分别不能超过600. 思路:此题的数据很烂.用贪心也能过,用01背包也可以.都测试不出到底那些是错的. #include < ...

  6. HDOJ(HDU).1864 最大报销额 (贪心)

    HDOJ(HDU).1864 最大报销额 题意分析 题目有点问题,原题中说的 单项物品的价值不得超过600元 应该是单类物品的价值不能超过600元. 一开始以为是01背包,后来按贪心写过了. 一张一张 ...

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

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

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

    题目链接:https://vjudge.net/problem/HDU-1864 题目大意: 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求 ...

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

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

随机推荐

  1. beta版本贡献率

    队名:攻城小分队 031302410 郭怡锋 : 占比:50% 031302411 洪大钊: 占比:30% 031302206 陈振贵: 占比:10% 031302416 黄伟祥: 占比:10%

  2. Linux大文件已删除,但df查看已使用的空间并未减少解决

    在我的生活当中遇到磁盘快满了,这时候准备去删除一些大文件 于是我使用ncdu 查看了一下当前系统占用资源比较多的是那些文件,结果一看是elasticsearch的日志文件,好吧,竟然找到源头了,那就把 ...

  3. shiro 与 web 的结合

    本次使用的jar包为 shiro-core-.jar shiro-web-.jar 从Shiro 1.2开始引入了Environment/WebEnvironment的概念,即由它们的实现提供相应的S ...

  4. 解决vs2015使用fopen、fprintf等函数报错的问题

    出现错误提示: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable ...

  5. iOS开发icon&images Size

    https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/IconMatrix ...

  6. A.2 Main

    程序的执行从类Main的方法main开始.方法main创建了一个词法分析器和一个语法分析器,然后调用语法分析器中的方法program. 1: package main: 2: import java. ...

  7. java初学的分析

    java初学的分析第一阶段:入门阶段学习目标:简单项目开发学习内容:1.Java入门书籍,Java基础知识.关于Java入门级的书,给大家推荐过<Java编程思想>.<Java核心技 ...

  8. XUnit学习

    1.建立测试单元项目 2.引用XUnit.dll或者在Nuget里安装XUnit 3.安装Nuget->xUnit.net[Runner: Visual Studio] 4.打开 测试-> ...

  9. CentOS 6.4下安装Oracle 11gR2

    安装前须知: 内存(RAM)的最小要求是 1GB,建议 2GB 及以上. 虚拟内存 swap 建议:内存为 1GB~2GB 时建议swap大小为内存大小的 1.5 倍:内存为 2GB~16GB 时建议 ...

  10. c++模板库(简介)

    目 录 STL 简介 ......................................................................................... ...