标签:des style io os ar java for sp div
浙大计算机研究生复试上机考试-2007年
题目大意:基本能看懂,再说一下,给你N张发票,发票上只有A、B、C类物品能报销,
且一张发票最多报销1000元,A、B、C类商品每种都不能超过600元。给你一笔经费,
问符合报销的发票中,最多能报销多少钱。
思路:把价格*100转为整形,就可以把符合报销的发票作为物品,钱作为背包重量和价值,
总容量为经费。求这笔经费最多能报销多少钱。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int money[40]; int dp[3000010];//数组规模为1000*30*100 = 3000000 int main() { double Q,price; char type; int N,m; while(~scanf("%lf%d",&Q,&N) && N!=0) { memset(money,0,sizeof(money)); for(int i = 0; i < N; i++) { int flag = 0; int a,b,c; a = b = c = 0; scanf("%d",&m); for(int j = 0; j < m; j++) { getchar(); scanf("%c:%lf",&type,&price); //scanf("%*c%c:%lf",&type,&price); int t = (int)(price*100); if(type == 'A') { a += t; } else if(type == 'B') { b += t; } else if(type == 'C') { c += t; } else { flag = 1;//含有A、B、C类物品除外的物品 } } if(flag == 0 && a<=60000 && b<=60000 && c<=60000 && a+b+c<=100000) { money[i] = a + b + c; } else { money[i] = (int)(Q*100)+1; } } memset(dp,0,sizeof(dp)); for(int i = 0; i < N; i++) { for(int j = (int)(Q*100); j>=money[i]; j--) { dp[j] = max(dp[j],dp[j-money[i]] + money[i]); } } printf("%.2lf\n",dp[(int)(Q*100)]/100.0); } return 0; }
标签:des style io os ar java for sp div
原文地址:http://blog.csdn.net/lianai911/article/details/40190749