HDU 1864 最大报销额 背包问题
2013-04-19 10:06
253 查看
分析:虽然看上去就知道是一个背包问题,但是,数据都是小数,而且只有两个小数,如果把每个数都*100再取整,这样的话,就可以放心用背包了,而且不会丢失数据.
注意:题中有个"单项物品的价值不得超过600元"中的"单项"是指一类,当时我就被这误导了,WA好多次.
http://acm.hdu.edu.cn/showproblem.php?pid=1864
注意:题中有个"单项物品的价值不得超过600元"中的"单项"是指一类,当时我就被这误导了,WA好多次.
http://acm.hdu.edu.cn/showproblem.php?pid=1864
#include<iostream> #include<string> #include<cstring> #include<algorithm> #include<cstdio> #include<cmath> #include<cctype> #include<iomanip> #include<queue> using namespace std; const int maxn=5000000; int f[50]; int dp[maxn]; int main(){ double Q; int n; while(cin>>Q>>n&&n){ int qq=Q*100,t=0; for(int i=0,q=1,m; i<n; ++i,q=1){ double s=0; cin>>m; double c[3]={0,0,0}; while(m--){ getchar(); char a; double b; scanf("%c:%lf",&a,&b); if((a!='A'&&a!='B'&&a!='C')||b>600.0)q=0; if(a=='A')c[0]+=b; if(a=='B')c[1]+=b; if(a=='C')c[2]+=b; s+=b; } if(c[0]>600.0||c[1]>600.0||c[2]>600.0)q=0; if(s>1000.0||s>Q||s<=0)q=0; if(q) f[t++]=s*100; } memset(dp,0,sizeof(dp)); for( int i=0; i<t; ++i ) for( int j=qq; j>=f[i]; --j ) if(dp[j]<dp[j-f[i]]+f[i]) dp[j]=dp[j-f[i]]+f[i]; printf("%.2lf\n",dp[qq]/100.0); } return 0; }
相关文章推荐
- 最大报销额(动态规划:01背包问题变形)
- hdu 1864 最大报销额 01背包
- 题目1025:最大报销额(0-1背包问题)
- HDU 1864(最大报销额)基础0-1背包问题
- HDU 1864 最大报销额 (DP-01背包问题)
- HDoj.1864 最大报销额【动归、背包】 2016/04/11
- 动态规划实例(七):01背包问题最大价值
- 九度OJ 1025:最大报销额 (01背包、DP)
- 最大报销额(可转化成01背包)
- hdu 1864 最大报销额(dp/背包)
- hdu 1864 最大报销额
- 0-1背包问题;动态规划;时间复杂度O(n方);给出最大价值与解得情况;内有动态规划思路总结;
- 小P的故事——神奇的发票报销(背包问题)
- 最大报销额(01背包问题)
- HDU 1864 最大报销额 背包(处理浮点数小技巧)
- 最大报销额--0-1背包
- hdu 1864 最大报销额 (DP)
- NYOJ 824 Greedy Mouse (物体可分割背包问题,尽可能让价值总量最大)
- HDU1864 最大报销额 (0-1背包)
- leetcode 474. Ones and Zeroes若干0和1组成字符串最大数量+动态规划DP+背包问题