hdu 1864

//两点注意1、乘上100,我一开始乘上1000,本来想的保留两位小数应该先保留三位的,可是超空间了
//2.不超过600是每类的意思,而不是每一个的意思 
#include<iostream>
#include<iomanip>
using namespace std;

int dp[3000005];
int Q,N,n,i,j;
//每张发票的价值
int val_n; 
int value[35];
int goods[3];

int main(){
    double pack_v;
    char ch1,ch2;
    while(cin>>pack_v>>N){
        if(N==0)
            break;
        memset(dp,0,sizeof(dp));
        Q=(int)(pack_v*100);
        bool flag;
        val_n=1;
        while(N--){
            flag=false;
            memset(goods,0,sizeof(goods));
            cin>>n;
            double limit;
            int sum=0;
            for(i=0;i<n;i++){
                cin>>ch1>>ch2;
                cin>>limit;
                if(limit>600)
                    flag=true;
                if(ch1=='A'||ch1=='B'||ch1=='C')
                    goods[ch1-'A']+=(int)(limit*100);
                else
                    flag=true;
            }
            if(!flag){
                for(i=0;i<3;i++){
                    sum+=goods[i];
                    if(goods[i]>60000)
                        flag=true;
                    }
                if(sum>100000)
                    flag=true;
            }
            if(!flag)
                value[val_n++]=sum;
        }//end while(N--)
        //开始背包val_n记录可用的发票数 
        for(i=1;i<val_n;i++){
            for(int v=Q;v>=0;v--){
                 if(v-value[i]>=0){
                     dp[v]=max(dp[v],dp[v-value[i]]+value[i]);
                 }        
            }
        }
        cout<<setiosflags(ios::fixed);
        cout<<setprecision(2)<<dp[Q]*1.0/100<<endl;
    }
    return 0;    
} 

你可能感兴趣的:(ios,c,ini)