HDOJ 1864 最大报销额[01背包]

来源:互联网 发布:淘宝水印logo设计 编辑:程序博客网 时间:2024/06/06 09:30

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1864

题目是和01背包同样的问题;

现将数据处理一下,将能报销的单子统计出来

设dp[i]为加入第i张支票的话,可以报销的最大报销额 

那么record[i]=max{record(j)}+dp[i];0<=j<i;

给定一些物体的体积,给定一个背包体积;

使背包里的物体体积最大 

代码:

#include<iostream>

#include<cmath>

#include<cstdio>

#include<cstring>

using namespace std;

int main(){

   //freopen("1010.txt","r",stdin);

   double sum,dp[33],record[33];

   double a,b,c,p,price,maxn,ans;

    intn,t,number;

    chartemp,temp2;

    boolflag;

   while(scanf("%lf%d",&sum,&n)&&n){

       memset(record, 0,sizeof(record));

       number=0;

       for(inti=0;i<n;i++){

          scanf("%d",&t);

          p=0;

          flag=true;

          a=b=c=0.0;

          while(t--){

              scanf("%c%c%lf",&temp,&temp2,&price);

             if(temp=='A'){

                 a+=price;

             }

              elseif(temp=='B'){

                 b+=price;

             }

              elseif(temp=='C'){

                 c+=price;

             }

             else{

                 flag=false;

             }

          }

          if(flag &&a<=600 &&b<=600 &&c<=600 &&a+b+c<=1000){

             dp[number++]=a+b+c;

          }

       }

       ans=0.0;

       for(inti=0;i<number;i++){

          maxn=0.0;

          for(int j=0;j<i;j++){

             if(record[j]>maxn &&(record[j]+dp[i]<=sum)){

                 maxn=record[j];

             }

          }

          record[i]=maxn+dp[i];

          if(record[i]>ans){

             ans=record[i];

          }

       }

      printf("%.2lf\n",ans);

   }

   return 0;

}


0 0
原创粉丝点击