题目地址:HDU 1864
刚上来看着挺麻烦的。。仔细看了看原来好简单好简单。。。只要去掉一些不符合要求的发票,剩下的就是最简单的背包问题了。。对于小数问题,只要*100就变成整数了。
代码如下:
#include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <cmath> #include <stack> #include <map> using namespace std; int dp[3000000], aa[40]; int main() { double q,y, ans; int n, m,i,p ,j, x, flag, s, k, a, b, c; char ch; while(scanf("%lf%d",&q,&p)!=EOF&&p) { x=q*100; j=0; for(i=0; i<p; i++) { scanf("%d",&m); flag=0; s=0; a=b=c=0; while(m--) { getchar(); scanf("%c:%lf",&ch,&y); if(ch=='A') { a+=y*100; } else if(ch=='B') { b+=y*100; } else if(ch=='C') { c+=y*100; } else { flag=1; } if(a>60000||b>60000||c>60000) flag=1; } s=a+b+c; if(!flag&&s<=100000) { aa[j++]=s; } } memset(dp,0,sizeof(dp)); for(i=0;i<j;i++) { for(k=x;k>=aa[i];k--) { dp[k]=max(dp[k],dp[k-aa[i]]+aa[i]); } } ans=dp[x]*1.0/100; printf("%.2lf\n",ans); } return 0; }
HDU 1864最大报销额(一维背包),布布扣,bubuko.com
原文:http://blog.csdn.net/scf0920/article/details/38301593