hdu1864 (01背包)

本文详细探讨了在购物报销场景中如何优化数组使用,并通过代码实例展示了注意事项和实现过程,确保合规性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意事项:
1.数组至少要开到3000050;
2.是单类物品不能超过600元,不是单项,如A:310 A:320,那A类物品为630元,不符合要求,不能报销;
3.用scanf()读入的话,要先读掉类型字符前的一个空格。
代码:

#include<stdio.h>
#include<string.h>
#define max(x,y) (x>y?x:y)
int main()
{
    double q;
    int n,dp[3000050];
    while(~scanf("%lf%d",&q,&n))
    {
        if(n==0)
            break;
        char c,d;
        double mag[3];
        int sum=(int)(q*100);
        int i,j,k,t=1,a[100],flag;
        double b;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&k);
            flag=1;
            for(j=0;j<=2;j++)
                mag[j]=0;
            while(k--)
            {
                scanf(" %c:%lf",&c,&b);
                if(c=='A')
                {
                    if(mag[0]+b<=600)
                        mag[0]=mag[0]+b;
                    else
                        flag=0;
                }
                else if(c=='B')
                {
                    if(mag[1]+b<=600)
                        mag[1]=mag[1]+b;
                    else
                        flag=0;
                }
                else if(c=='C')
                {
                    if(mag[2]+b<=600)
                        mag[2]=mag[2]+b;
                    else
                        flag=0;
                }
                else
                    flag=0;
            }
            if((mag[0]+mag[1]+mag[2])<=1000&&flag)
                a[t++]=int((mag[0]+mag[1]+mag[2])*100);
        }
        memset(dp,0,sizeof(dp));
        for(i=1;i<t;i++)
            for(j=sum;j>=a[i];j--)
            {
                dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
            }
        double temp=double(dp[sum]);
        printf("%.2lf\n",temp/100);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值