标签: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