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

链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1864

#include <bits/stdc++.h>
using namespace std;
const int maxn =3e6+10;
int dp[maxn],w[35];
int main()
{
    int n,num,flag,cnt;
    char str,b;
    double m,f;
    double A,B,C;
    int sum;
    while(cin>>m>>n&&n)
    {
        cnt=0;
        sum=(int)(m*100);//转化为整数,乘100是为了背包计算
        memset(dp,0,sizeof dp);
        for(int i=0; i<n; i++)
        {
            flag =0;
            A = 0;
            B = 0;
            C = 0;
            cin>>num;
            for(int j=0; j<num; j++)
            {
                cin>>str>>b>>f;
                if(str=='A')
                    A+=f;
                else if(str=='B')
                    B+=f;
                else if(str=='C')
                    C+=f;
                else
                    flag = 1;
            }
            if(!flag&&A<=600&&B<=600&&C<=600&&A+B+C<=1000)//三类都小于600并且总合小于1000并且没有其他类型
                w[cnt++]=(A+B+C)*100;
        }
        for(int i=0; i<cnt; i++)
        {
            for(int j=sum; j>=w[i]; j--)         //01 背包计算 体积和价格一致而已
            dp[j]=max(dp[j],dp[j-w[i]]+w[i]);
        }
        double money= dp[sum]/100.0;
        printf("%.2lf\n",money);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值