HDU 1864

来源:互联网 发布:第三方网络销售平台 编辑:程序博客网 时间:2024/06/16 18:16

来个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;}


0 0