HDU1864(01背包)

来源:互联网 发布:淘宝手机描述图片尺寸 编辑:程序博客网 时间:2024/05/22 05:33

题意还是比较复杂的,限制比较多,需要先筛除不满足报销条件的发票:

1.出现 ABC之外的类不报销;2.一张发票内单个类超过600元不报销;3.发票的总金额超过1000不报销。

知道这三个条件之后筛除不满足的剩下的就是01背包了。

这里金额是double类,所以统一乘100,最后再除掉就好了(数据范围可以接受的情况下),把重量和价值看作一样,不过这样会很慢。方程:dp[j] = max( dp[j] , dp[j-v[i]]+v[i] );

另一种优秀的做法的方程是:f[j]=max(f[j],f[j-1]+v[i]);

第一种:

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;//#pragma comment(linker, "/STACK:1024000000,1024000000")const int maxn = 3000000+10;int dp[maxn];double money;double max_money;int n;int time;int v[maxn];char ch1,ch2;int main(){    while(cin >> max_money >> n)    {        if(n==0) break;        memset(v,0,sizeof(v));        memset(dp,0,sizeof(dp));        int E=0;        bool flag = true;        max_money *= 100;        int Max_money = max_money;        for(int k=0; k<n; k++)        {            cin >> time;            int sum = 0;            flag = true;            int a,b,c;            a=b=c=0;            for(int i=0; i<time; i++)            {                cin >> ch1 >> ch2;                cin >> money;                if(money>600) flag = false;                money *= 100;                int Money = money;                if(ch1=='A') a+=Money;                else if(ch1=='B') b+=Money;                else if(ch1=='C') c+=Money;                else flag = false;                if(a>60000||b>60000||c>60000) flag = false;                sum += Money;                if( sum>100000 ) flag = false;            }//            cout << "sum:" << sum << endl;//            cout << "flag" << flag <<endl;            if(flag)            {                v[E++] = sum;               //- cout << "sum: " <<  sum <<endl;            }        }//        cout << "EEE:" <<  E <<endl;//        for(int i=0;i<E;i++) cout <<   "  " << v[i];        for(int i=0;i<E;i++)        {            for(int j=Max_money;j>=v[i];j--)            {                dp[j] = max( dp[j] , dp[j-v[i]]+v[i] );            }        }        printf("%.2lf\n",dp[Max_money]*1.0/100 );    }    return 0;}



  我山东

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 本科毕业论文没写英文摘要怎么办 气泵储气罐有个小眼漏气怎么办 吸拉开关坏了怎么办 窗口数量已达上限怎么办 村土地原始台账没有怎么办 涂防晒霜后出汗怎么办 张拉千斤顶泄荷回油不到位怎么办 隧道二衬打到一半没混凝土怎么办 在左车道骑电动车撞到车怎么办 电镐钻头卡住了怎么办 玩具机器人无线遥控不了怎么办 电锤锤头卸不下来怎么办 打地基没打出硬土层怎么办 中标的项目经理没有B证怎么办 12306证件被注册过怎么办 政府3p项目不给钱怎么办 电气没考上国网怎么办 小区宽带业务被个人承包怎么办 高铁用户名忘了怎么办 昆山社保号是8位怎么办 高铁票误了时间怎么办 动车票没赶上车怎么办 铁路用户名已存在要怎么办 铁路12306用户名忘了怎么办 铁路12306的用户名忘了怎么办 铁路12306注册名已存在怎么办 12306账号密码忘记了怎么办 12306登录名忘记了怎么办 电脑系统崩溃开不了机怎么办 高铁车票没赶上怎么办 机票错点了退票怎么办 快递号码留错了怎么办 物流号码留错了怎么办 12306身份信息被注册怎么办 12306注册身份信息重复怎么办 12306账号被注册了怎么办 高铁账号忘记了怎么办 铁路12306网站密码错误怎么办 网上买火车票密码忘了怎么办 快递没收到点了确认收货怎么办 快递没收到自动确认收货怎么办