hdu1864

dp水题

选择出有效数据        然后就是01背包

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=3e6+7;
int T,n,flag,w,t;
double V,x,sum,a,b,c;
char  ch;
int q[maxn],dp[maxn];
int main(){
    while(~scanf("%lf%d",&V,&T),T!=0){
        memset(q,0,sizeof(q));w=0;
        memset(dp,0,sizeof(dp));
        V=100*V;
        while(T--){
            scanf("%d",&n);
            flag=0;sum=0;a=0;b=0;c=0;
            while(n--){
                scanf(" %c:%lf",&ch,&x);
                sum+=x;
                if(ch=='A')a+=x;
                if(ch=='B')b+=x;
                if(ch=='C')c+=x;
                if(ch!='A'&&ch!='B'&&ch!='C') flag=1;
                if(a>600||b>600||c>600) flag=1;
            }
            if(flag==1||sum>1000) continue;
            else q[w++]=(int)(sum*100);
        }
        for(int i=0;i<w;i++){
            for(int j=(int)V;j>=q[i];j--){
                dp[j]=max(dp[j],dp[j-q[i]]+q[i]);
            }
        }
        printf("%.2f\n",(1.0*dp[(int)V])/100);
    }
}

猜你喜欢

转载自blog.csdn.net/holly_Z_P_F/article/details/81393107
今日推荐