码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 最大报销额

时间:2015-03-07 22:33:12      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

本题也是一个背包的问题,我觉得这道题的核心就是根据精确度将浮点型转化为整型然后利用动态规划进行求解,注意对题意的理解,有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

 

hdu 最大报销额

标签:

原文地址:http://www.cnblogs.com/acm-jing/p/4320922.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!