hdu1864——最大报销额

现有一笔经费可以报销一定额度的***。允许报销的***类型包括买图书(A类)、文具(B类)、差旅(C类),要求每张***的总额不得超过1000元,每张***上,单项物品的价值不得超过600元。现请你编写程序,在给出的一堆***中找出可以报销的、不超过给定额度的最大报销额。
Input
测试输入包含若干测试用例。每个测试用例的第1行包含两个正数 Q 和 N,其中 Q 是给定的报销额度,N(<=30)是***张数。随后是 N 行输入,每行的格式为:
m Type_1:price_1 Type_2:price_2 … Type_m:price_m
其中正整数 m 是这张***上所开物品的件数,Type_i 和 price_i 是第 i 项物品的种类和价值。物品种类用一个大写英文字母表示。当N为0时,全部输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即可以报销的最大数额,精确到小数点后2位。
Sample Input
200.00 3
2 A:23.50 B:100.00
1 C:650.00
3 A:59.99 A:120.00 X:10.00
1200.00 2
2 B:600.00 A:400.00
1 C:200.50
1200.50 3
2 B:600.00 A:400.00
1 C:200.50
1 A:100.00
100.00 0
Sample Output
123.50
1000.00
1200.50

这题就是输入处理加浮点数的01背包
几个坑点,一是这个读取的问题,主要要格式化读入,前面加个空格,二是项目总额不能超过600是指所有A 所有B 这样每一向加起来不能超过600 误认为是每一小项不能超过600 然后就是浮点数的处理,看了一个博客将所有浮点数*100得到整数来进行dp 这样子数组要开大100倍 不过在这题还可以

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
double q;
int n;
int w[50];
int dp[4000010];
int main(void){
    //freopen("data.txt","r",stdin);
    while(~scanf("%lf%d",&q,&n) && n){
        memset(w,0,sizeof(w));
        memset(dp,0,sizeof(dp));
        int cnt=0;
        for(int i=0;i<n;i++){
            int num;
            scanf("%d",&num);
            char t;
            double x;
            int sum=0;
            int flag=0;
            int ta=0;
            int tb=0;
            int tc=0;
            for(int j=0;j<num;j++){
                scanf(" %c:%lf",&t,&x);
                //printf("%c---%lf\n",t,x);
                x=(int)(x*100);
                if(!flag){
                    if(t=='A'){
                        ta+=x;
                        if(ta>60000){
                            flag=1;
                        }
                    }
                    else if(t=='B'){
                        tb+=x;
                        if(tb>60000){
                            flag=1;
                        }
                    }
                    else if(t=='C'){
                        tc+=x;
                        if(tc>60000){
                            flag=1;
                        }
                    }
                    else{
                        flag=1;
                    }
                }
            }
            sum=ta+tb+tc;
            if(sum>100000){
                flag=1;
            }
            if(!flag){
                w[cnt++]=sum;
            }
        }
        for(int i=0;i<cnt;i++){
            for(int j=(int)(q*100);j>=w[i];j--){
                dp[j]=max(dp[j],dp[(int)(j-w[i])]+w[i]);
            }
        }
        printf("%.2lf\n",dp[(int)(q*100)]*1.0/100);
    }
    return 0;
}
全部评论

相关推荐

Lorn的意义:1.你这根本就不会写简历呀,了解太少了 2.你这些项目经历感觉真的没啥亮点啊,描述的不行,重写书写一下让人看到核心,就继续海投 注意七八月份ofer还是比较多的,越往后机会越少,抓住时机,抓紧检查疏漏,加油查看图片
点赞 评论 收藏
分享
避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
07-16 17:55
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务