HDU 1864

发票的额度是小数,但是只要求精确到两位,所以我们把初始数据乘以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
",r/100);
        scanf("%lf%d",&maxi,&n);
        imaxi=maxi*100;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/tun117/p/4429324.html