HDU 1864

本文通过一个具体的01背包问题实例,介绍了如何使用C++实现该算法,并详细展示了字符串处理和内存管理的方法。

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

来个DP练练手,这个题就是个01背包没什么难度的,稍微考验码力的就是字符串的处理读取数据的时候了,然后就是超内存了一次,只需要分析判断好内存最大开多少就好了。因为最多是30张发票,每张面额不超过1000,因此是30000,后来在01背包过程时数据被扩大100倍,因此最后是3000050

#include<cstdio>
#include<cstring>
#include<algorithm>


using namespace std;

int n;
double q,a[50],dp[3000050],c[50];

char s,cc;
int vis[35];

int main()
{
    while(scanf("%lf%d",&q,&n)!=EOF)
    {
     if(n==0)
     {
         break;
     }
     memset(vis,0,sizeof(vis));
     memset(c,0,sizeof(c));
     memset(dp,0,sizeof(dp));
    for(int j=1;j<=n;j++)
    {
         vis[j]=1;
         int m;
         scanf("%d",&m);
         double sum=0,temp;
         memset(a,0,sizeof(a));
          for(int i=0;i<m;i++)
          {
              cc=getchar();
              s=getchar();
              cc=getchar();
              scanf("%lf",&temp);
              if(s=='A'||s=='B'||s=='C')
              {
               a[s-'A']+=temp;
               sum+=temp;
              }
              else
              {
                  vis[j]=0;
              }
            if(a[s-'A']>600)
            {
               vis[j]=0;
            }
          }
          if(sum>1000)
          {
            vis[j]=0;
          }
          else
          {
            c[j]=sum;
          }
     }
     for(int j=1;j<=n;j++)
     {
         if(vis[j])
         {
            for(double v=q;v>=c[j];v=v-0.01)
            {
                int vv=v*100;
                dp[vv]=max(dp[vv],dp[vv-(int)(c[j]*100)]+c[j]);
            }
         }
     }
     printf("%.2lf\n",dp[(int)(q*100)]);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值