http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=187#problem/G

该题要注意的就是每张单子A种类的总和不能大与600,同样B,C类也一样,还有注意如果不是A,B,C类的不可以报销;

该题就是要把浮点型变成整数这样才能用01背包,这里就只要乘以100就可以了。

这题考的背包很简单,就是输入的金额为背包的容积,债券既是物体的体积又是物体的利润。就是处理输入的数据有点麻烦,这是我所不擅长的。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int dp[3000001],w[31];
int main()
{
    int n,V,m,flag,tt;
    double sum,price;
    char c;
    while(scanf("%lf%d",&sum,&n)!=EOF)
    {
       if(n==0) break;
       sum=sum*100;
       V=(int)sum;
       tt=0;
       int t,ta=0,tb=0,tc=0,x;
       for(int i=1;i<=n;i++)
       {
           sum=0;
           ta=0,tb=0,tc=0;
           scanf("%d",&m);
           flag=0;
           while(m--)
           {
               scanf("%*c%c:%lf",&c,&price);
               price=price*100;
               x=(int)price;
               if(flag==0)
               {
                   if((c=='A')||(c=='B')||(c=='C'))
                   {
                       if(c=='A'&&ta+x<=60000)
                       {
                           ta=ta+x;
                       }
                       else if(c=='B'&&tb+x<=60000)
                       {
                           tb=tb+x;
                       }
                       else if(c=='C'&&tc+x<=60000)
                       {
                           tc=tc+x;
                       }
                       else flag=1;
                   }
                   else flag=1;
               }
           }
           t=ta+tb+tc;
           if(flag==0&&t<=100000)
           {
               w[tt++]=t;
           }
       }
       memset(dp,0,sizeof(dp));
       for(int i=0;i<tt;i++)
       {
           for(int j=V;j>=w[i];j--)
           {
               if(dp[j-w[i]]+w[i]>dp[j])
                dp[j]=dp[j-w[i]]+w[i];
           }
       }
       double money=dp[V]/100.0;
       printf("%.2lf\n",money);
    }
    return 0;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.