您的位置:首页 > 其它

hdu1864 — 最大报销额

2015-07-16 09:35 316 查看
题目大意:给出n张发票,每张发票可报销的类型只有 A、B、C三类,若有其他不予报销,其中可报销的每张发票总额不超过1000,单项消费金额不超过600,给出报销额度,问可报销的最大总额

思路分析:该题花费即价值,在输入时进行筛选,不符合条件的发票不进行处理,符合条件的将该张发票的总金额计算出来,为方便处理,将所有涉及金额数目*100

方程为 dp [ j ] = max ( dp [ j ] , dp [ j - T [ i ] ] + T [ i ] )   其中T [ i ] 为第 i 张可报销发票的总金额,dp [ j ] 表示在报销额度为 j 时,报销前 i 张发票可得到的最大报销总额

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int M1=100000;
const int M2=60000;
int T[35];
int dp[M1*30+5];
int coun=0;

void Input(int n)
{
for(int _=1; _<=n; _++)
{
int m,flag,a=0,b=0,c=0;
scanf("%d",&m);
for(int i=1; i<=m; i++)
{
char s[20],ch;
scanf("%s",s);
int k,r;
ch=s[0];
flag=1;
sscanf(s,"%*[^0-9]%i",&k);
sscanf(s,"%*[^0-9]%*[0-9]%*[.]%i",&r);
k=k*100+r;
switch(ch)
{
case 'A':
a+=k;
break;
case 'B':
b+=k;
break;
case 'C':
c+=k;
break;
default:
flag=0;
}
}
int sum=a+b+c;
if(a<=M2&&b<=M2&&c<=M2&&sum<=M1&&flag)
T[++coun]=sum;
}
}

int main()
{
double q;
int n;
while(scanf("%lf%d",&q,&n)&&n)
{
q*=100;
coun=0;
Input(n);
memset(dp,0,sizeof(dp));
for(int i=1;i<=coun;i++)
{
for(int j=q;j>=T[i];j--)
dp[j]=max(dp[j],dp[j-T[i]]+T[i]);
}
printf("%.2lf\n",dp[int(q)]/100.0);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  01背包