题意大家都看得懂,需要注意两点:
1.报销的只有A、B、C三种类型,要是出现D、E、F.....之类的,这张发票是不能报销的。
2.一张发票上,同种类型的物品加起来大于600,这张发票就是不能报销的,而不是一定要单件物品大于600。
#include <iostream> using namespace std; int dp[3000010];/* 之前将这个数组声明在main函数中,老是报错说栈溢出, 后来问了老师,才知道函数栈中的空间是有限的(因系统而异), 一般是1M,即262144个int。 处理方法:1.放在全局数据区;2.new 出来(使用堆区,当然这个不适合ACMer)*/ int main() { int m, i, n, id, v; float f_val, f_limit; int value[26], total, d_val, d_limit, cost[31]; char ch; bool flag; while(scanf("%f %d", &f_limit, &n) && n) { id = 1; d_limit = int(f_limit*100); while(n--) { scanf("%d", &m); total = 0; memset(value, 0, sizeof(value)); flag = true; for(i = 0; i < m; i++) { scanf(" %c:%f", &ch, &f_val); if(ch-'A' > 2) flag = false; if(flag) { d_val = int(f_val*100); total += d_val; value[ch-'A'] += d_val; if(total > 100000 || value[ch-'A'] > 60000) flag = false; } } if(flag) cost[id++] = total; } memset(dp, 0, sizeof(dp)); for(i = 1; i < id; i++) for(v = d_limit; v >= cost[i]; v--) if(dp[v] < dp[v-cost[i]] + cost[i]) dp[v] = dp[v-cost[i]] + cost[i]; float ans = (float)dp[d_limit]/100; printf("%.2f\n", ans); } return 0; }