注意超时问题,一个题可能有很多种方法解决,但是想到解决方法的同时一定要考虑这个方法的复杂度,特别是对于acm的题,有可能出现超时的情况,很浪费时间

正式比赛中就很遗憾,血的教训。

下面贴上超时的代码并做出分析,下次绝不能这样了!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Description

现有一笔经费可以报销一定额度的发票。允许报销的发票类型包括买图书(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
 
 
 
问题:多组案例,输入每组案例中最大报销金额和账单数,账单总金额小于最大报销数并且仅仅包含A,B,C物品的账单才报销,
   总金额大于最大报销数的时候可以选取一部分进行报销
   第一行输入每组案例的最大报销金额Q和账单数N
   下面N行,每行第一个数据输入这个账单上的物品数m,然后是m个物品的名字以及金额
     输出每个案例的最大实际报销金额,
 
分析:本来用的dfs,写程序和调代码用了一个多小时,最后发现没过
   分析了一下原因,最坏的情况,最大可报销金额为无穷,每张账单都满足报销条件,那么就要遍历所有选择的可能性
   有C(30, 1) + C(30, 2) + C(30, 3) + …… + C(30, n)种可能性
   很可能超时嘛
贴超时代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std; double ans[], sum, Q, maxi;
int cnt;
bool vis[];
void dfs(double sum) //传递参数的时候吧sum写成double类型了
{
if(sum > Q)
return;
//printf("sum = %.2lf\n", sum);
for(int i = ; i < cnt; i++)
{
if(!vis[i] && sum+ans[i] <= Q) //这里没加等于号,忽略等于的时候也可行
{
vis[i] = ;
sum += ans[i];
if(sum > maxi)
maxi = sum;
dfs(sum);
sum -= ans[i];
vis[i] = ;
}
}
}
int main()
{
double A, B, C, y;
int N, m;
char x;
//freopen("input.txt", "r", stdin);
while(scanf("%lf%d", &Q, &N) && N)
{
sum = ;
cnt = ;
maxi = ;
memset(vis, , sizeof(vis));
for(int i = ; i < N; i++)
{
int flag = ;
scanf("%d", &m);
A = B = C = ;
while(m--)
{
getchar();
scanf("%c:%lf", &x, &y);
switch (x)
{
case 'A': A += y; break;
case 'B': B += y; break;
case 'C': C += y; break;
default: flag = ; break;
}
}
if (flag== && A<= && B<= && C<= && A + B + C <= && A+B+C <= Q)
{
ans[cnt++] = A + B + C;
//printf("ans[%d] = %lf\n", cnt-1, ans[cnt-1]);
}
}
dfs();
printf("%.2lf\n", maxi);
}
return ;
}
 
 
 
 
 
 
 

B - 最大报销额的更多相关文章

  1. DP专题训练之HDU 1864 最大报销额

    做DP一定要注意数组的大小,嗯,就是这样~ Description 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过10 ...

  2. hdu 1864 01背包 最大报销额

    http://acm.hdu.edu.cn/showproblem.php?pid=1864 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...

  3. HDU 1864最大报销额 01背包问题

    B - 最大报销额 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit St ...

  4. HDOJ 1864 最大报销额(01背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=1864 最大报销额 Time Limit: 1000/1000 MS (Java/Others)    Memor ...

  5. hdu1864 最大报销额(01背包)

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1864 Problem ...

  6. 九度OJ 1025 最大报销额(01背包)

    题目1025:最大报销额 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2683 解决:608 题目描述: 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具( ...

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

    这道题属于简单的01背包,但是背包问题还算简单,就是前面的细节处理的时候要注意,题意大致说了三条限制吧 1. 只有a, b, c 三种类型的发票可以报销,其它的一律不报销 2. 物品单项的报销额不超过 ...

  8. HDU 1864 最大报销额(DP)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1864 题目: 最大报销额 Time Limit: 1000/1000 MS (Java/Others) ...

  9. hdu 1864 最大报销额【01背包】

    题目链接:https://vjudge.net/problem/HDU-1864 题目大意: 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求 ...

随机推荐

  1. JS 获取浏览器窗口大小clientWidth、offsetWidth、scrollWidth

    常用: JS 获取浏览器窗口大小   // 获取窗口宽度 if (windows.innerWidth) winWidth = windows.innerWidth; else if ((docume ...

  2. javascript实现的功能--二级联动

    <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" ...

  3. android 百度最新地图sdk包怎么去除 放大缩小按钮

    // 隐藏缩放控件 int childCount = mMapView.getChildCount(); View zoom = null; ; i < childCount; i++) { V ...

  4. opencv-python 学习笔记2:实现目光跟随(又叫人脸跟随)

    如果机器人的脸能随着前方人脸而转动,你会不会觉得这种互动很有意思.年前的时候,学习了一下opencv,通过opencv可以简单的实现人脸跟随.再加上几个舵机控制头部转动,机器人就可以互动了.呵呵 这里 ...

  5. 基于Visual C++2013拆解世界五百强面试题--题5-自己实现strstr

    请用C语言实现字符串的查找函数strstr, 找到则返回子字符串的地址,没有找到返回为空,请用数组操作与指针操作实现 看到题目想到最简单的方法就是母字符串和子字符串比较,如果不同,将指向母字符串的指针 ...

  6. hdoj 2544 最短路(最短路+Dijkstrea算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 思路分析:该问题给定一个无向图,要求求从起始点到终点的最短路径长度:可以使用dijkstra算法 ...

  7. CALayer3-层的属性

    一.隐式动画属性 * 在前面几讲中已经提到.每个UIView内部都默认关联着一个CALayer,我们可用称这个Layer为Root Layer(根层). 全部的非Root Layer.也就是手动创建的 ...

  8. String的几种比较方法对比(Compare,CompareTo, CompareOrdinal、Equals)

    String类字符串比较大概有4种方法:Compare(),CompareTo(), CompareOrdinal()和Equals(). Compare()方法是CompareTo()的静态版本.而 ...

  9. jQ 操作积累

    1.判断radio是否选中:方式一:var val=$('input:radio[name="sex"]:checked').val(); //(val==null 未选中) 方式 ...

  10. Ext JS学习第十六天 事件机制event(一)

    此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件,相信你一定不陌生, 基本事件是什么?就类似于click.keypress.focus. ...