最大報銷額
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 21045 Accepted Submission(s): 6308
m Type_1:price_1 Type_2:price_2 ... Type_m:price_m
其中正整數 m 是這張發票上所開物品的件數,Type_i 和 price_i 是第 i 項物品的種類和價值。物品種類用一個大寫英文字母表示。當N爲0時,全部輸入結束,相應的結果不要輸出。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define max(a,b) a>b?a:b
using namespace std;
int a[30];
int dp[3000005];
int judge(char c)
{
if(c=='A') return 1;
if(c=='B') return 2;
if(c=='C') return 3;
return 0;
}
int main()
{
double Q;
int N;
while(scanf("%lf%d",&Q,&N)&&N)
{
int num=0;
int limit=Q*100;//輸入之後就直接擴大100倍轉化成整數
for(int i=0;i<N;i++)
{
int m;int flag=1;
scanf("%d",&m);
int sum1,sum2,sum3;
sum1=sum2=sum3=0;
while(m--)
{
char op;double need;
getchar();//這個不能丟!
scanf("%c:%lf",&op,&need);
need=need*100;
int x=need;//擴大100倍轉化成整數
if(!flag)//在不符合條件的話就捨去
continue;
if(judge(op)==0) flag=0;//不是A,B,C三種之內的,不報銷!
if(judge(op)==1) sum1+=x;
if(judge(op)==2) sum2+=x;
if(judge(op)==3) sum3+=x;
if((sum1>60000||sum2>60000||sum3>60000)) flag=0;//如果有一個小於600都不報銷
if(!flag)
continue; //因爲還要將輸入完成,所以要繼續循環,而不能跳出
}
if(sum1+sum2+sum3<=limit&&flag)//在之前輸入都滿足條件的前提下才保存到a中等着報銷
a[num++]=sum1+sum2+sum3;
}
memset(dp,0,sizeof(dp));//剛開始報銷爲0
for(int i=0;i<num;i++)//在limit的限制下能得到的最大的報銷
{
for(int j=limit;j>=a[i];j--)
{
dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
}
}
printf("%.2lf\n",dp[limit]/100.0);//按題意輸出
}
return 0;
}