hdu1864 — 最大报销额
2015-07-16 09:35
330 查看
题目大意:给出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;
}
思路分析:该题花费即价值,在输入时进行筛选,不符合条件的发票不进行处理,符合条件的将该张发票的总金额计算出来,为方便处理,将所有涉及金额数目*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;
}
相关文章推荐
- hdu 1203 I NEED A OFFER! 01背包
- poj 1159 Palindrome dp 字符串
- 我该如何向我的朋友解释“01背包”问题?
- 01背包问题
- hdu 2546 饭卡 (01背包)
- hdu 2602 Bone Collector (01背包 )
- hdu 2639 Bone Collector II (01背包,第k优解问题)
- [01背包]NOIP2001 PJ T4 装箱问题
- [01背包]NOIP 2005 PJ T3 采药 + 01背包的空间优化
- 01背包问题
- 01背包详解(ZeroOnePack)
- XX采药
- poj_1837
- hdu2546 — 饭卡 (01背包)
- hdu2955 — Robberies (01背包)
- 01背包 问题 思路 整理
- 小P的故事——神奇的饭卡(0—1背包,求剩余钱最少)
- HDU 2602 Bone Collector
- UVALive 3387 || HOJ 2196 Job Scheduling by Open Bidding
- HDU 2602 Bone Collector