hdu 最大报销额

本题也是一个背包的问题,我觉得这道题的核心就是根据精确度将浮点型转化为整型然后利用动态规划进行求解,注意对题意的理解,有3种支票是不能够报销的。

我开始照着这个思路进行思考,但是敲出来的第一个代码居然超时了,想了一下没想出来就看了一下别人的代码,感觉上没什么才差别,但是别人的却a掉了。。。希望有哪位朋友能够指点一下。

超时的代码:

复制代码
#include"iostream"
#include"stdio.h"
#include"cmath"
#include"string.h"
#include"algorithm"
#define mx 10005
using  namespace std;
int dp[5000024],flag,b[34];
char type;
double money;
int main()
{
    double m,suma,sumb,sumc,sum;
    int i,j,n,num,k;
    while(cin>>m>>n,n)
    {
        int count=0;
        int x=(int)(m*100);
        for(i=1;i<=n;i++)
        {
            cin>>num;
            suma=sumb=sumc=sum=0;
            getchar();
            flag=0;
            for(j=1;j<=num;j++)
            {
                cin>>type;
                getchar();
                cin>>money;
                if(j<num) getchar();
                money=(int)(money*100);
                if(!flag){
                if(type=='A')
                {
                    suma+=money;
                    if(suma>60000) {flag=1;break;}
                }
                else if(type=='B')
                {
                    sumb+=money;
                    if(sumb>60000) {flag=1;break;}
                }

                else if(type=='C')
                {
                    sumc+=money;
                    if(sumc>60000) {flag=1;break;}
                }
                else {flag=1;break;}

                }
           }
        sum=suma+sumb+sumc;
        if(!flag&&sum<=100000) b[count++]=sum;
    }
     memset(dp,0,sizeof(dp));
        for(i=0;i<=count;i++)
        {
            for(k=x;k>=b[i];k--)
            {
                if(dp[k]<dp[k-b[i]]+b[i])
                    dp[k]=dp[k-b[i]]+b[i];
            }
        }
     printf("%.2lf\n",dp[x]/100.0);
    }
    return 0;
}
View Code
复制代码

这里是别人的代码:

复制代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int dp[5000024]={0};
int  DP( int num[],int count, int  sum )
{
     memset( dp,0,sizeof( dp ) );
    for(int i=0;i<count; i++)
    {
         for( int j=sum;j>=num[i];j-- )
         {
             if( dp[j]<dp[j-num[i]]+num[i] )
                 dp[j]=dp[j-num[i]]+num[i];
         }
    }
    return dp[sum];
}
int main()
{
      int n,num[34],m;
      double sum,price;
      char c;
      while( scanf( "%lf%d",&sum,&n ),n )
      {
          int count=0;
          while( n-- )
          {
              scanf( "%d",&m );
              int flag=0;
              int t=0,ta=0,tb=0,tc=0;
              while( m-- )
              {
                  int x;
                   scanf( "%*c%c:%lf",&c,&price );
                   price*=100;
                   x=( int  )price;
                   if( flag==0 )
                   {
                       if((c=='A')||(c=='B')||(c=='C') )
                       {
                          if( c=='A' )
                             if( ( ta+x )<=60000 )
                               ta+=x;
                           else flag=1;
                          if( c=='B' )
                             if( ( tb+x )<=60000 )
                               tb+=x;
                           else flag=1;
                          if( c=='C' )
                            if( ( tc+x )<=60000 )
                               tc+=x;
                           else flag=1;
                       }
                       else flag=1;
                   }
              }
              t=ta+tb+tc;
              if( flag==0&&t<=100000 )
                 num[count++]=t;
          }
          sum*=100;
          int t=( int  )sum;
         printf( "%.2lf\n",(DP( num ,count,t)/100.0 ));

      }
      return 0;
}
View Code
复制代码

 

posted @   Run_For_Love  阅读(179)  评论(0编辑  收藏  举报
编辑推荐:
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
阅读排行:
· 官方的 MCP C# SDK:csharp-sdk
· 一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!
· 提示词工程师自白:我如何用一个技巧解放自己的生产力
· 一文搞懂MCP协议与Function Call的区别
· 如何不购买域名在云服务器上搭建HTTPS服务
点击右上角即可分享
微信分享提示