标签:
发票的额度是小数,但是只要求精确到两位,所以我们把初始数据乘以100进行处理。这道题我比较纠结的是dp的数组到底开多大...开大了内存超限,小了数组越界。
#include<stdio.h> #include<string.h> int val[50];//记录符合报销条件的发票的额度。(乘以100以后) int tmp[26];//临时记录发票每项的总额 int dp[3500000];//表示在钱数不超过i的前提下能报销的发票的钱的额度的最大总和 int max(int a,int b) { if(a>b) return a; return b; } int main() { double maxi,dtmp,sum; int n,i,j,nn,ok,num,imaxi; char ab; scanf("%lf%d",&maxi,&n); imaxi=maxi*100; while(n) { num=0; for(i=0;i<n;i++) { memset(tmp,0,sizeof(tmp)); sum=0; ok=1; scanf("%d",&nn); for(j=0;j<nn;j++) { getchar(); scanf("%c",&ab); if(ab!=‘A‘&&ab!=‘B‘&&ab!=‘C‘) ok=0; getchar(); scanf("%lf",&dtmp); tmp[ab-65]+=dtmp*100; sum+=dtmp*100; if(tmp[ab-65]>60000||sum>100000) ok=0; } if(ok) val[num++]=sum; } memset(dp,0,sizeof(dp)); for(i=0;i<num;i++) { for(j=imaxi;j>=val[i];j--) { dp[j]=max(dp[j],dp[j-val[i]]+val[i]); } } double r=dp[imaxi]; printf("%.2lf\n",r/100); scanf("%lf%d",&maxi,&n); imaxi=maxi*100; } return 0; }
标签:
原文地址:http://www.cnblogs.com/tun117/p/4429324.html