首页 > 其他 > 详细

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

时间:2014-07-30 17:38:44      阅读:307      评论:0      收藏:0      [点我收藏+]

题目地址: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

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

原文:http://blog.csdn.net/scf0920/article/details/38301593

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!