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

很简单的01背包,但是题目还是很蛋疼的注意题目中600,和1000这两个数,还有就是double和int的转换,1A了感觉还是不错的

/*************************************************************************
	> File Name: hdu1864.cpp
	> Author: yang
	> Mail:[email protected]
	> Created Time: 2014年08月23日 星期六 14:03:05
 ************************************************************************/

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
using namespace std;
#define N 3000100
int dp[N];
int main(){
//	freopen("in.txt","r",stdin);
	double q;
	int n;
	int sum[35];
	while(cin>>q>>n,n){
		memset(sum,0,sizeof(sum));
		q*=100;
		(int) q;
		for(int i=0;i<n;i++){
			int t;
			double p;
			char a,b;
			cin>>t;
			int sum_type[3];
			int p_sum=0;
			int flag=0;
			memset(sum_type,0,sizeof(sum_type));
			while(t--){
				cin>>a>>b>>p;
				p=p*100;
				(int) p;
				p_sum+=p;
//				cout<<"p_sum:"<<p_sum<<endl;
				if(a=='A') sum_type[0]+=p;
				if(a=='B') sum_type[1]+=p;
				if(a=='C') sum_type[2]+=p;
				if(a=='X') {
					flag=1;
					break;
				}
			}
			for(int j=0;j<3;j++)
				if(sum_type[j]>60000) flag=1;
			if(p_sum>100000) flag=1;
			if(flag==1)
				sum[i]=0;
			else
				sum[i]=p_sum;
//			cout<<"sun[i]"<<sum[i]<<endl;
		}

		memset(dp,0,sizeof(dp));
		for(int i=0;i<n;i++){
			for(int j=q;j>=sum[i];j--){
				dp[j]=max(dp[j],dp[j-sum[i]]+sum[i]);
			}
		}
		printf("%.2lf\n",dp[(int)q]/100.0);
	}
}
时间: 2024-10-05 23:58:47

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

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

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

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

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

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 最大报销额 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 最大报销额 (DP-01背包问题)

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

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>