hdu1864
题解 友情链接~
同一个方法做的
#include<iostream> #include<cstdio> using namespace std; int N; double V,dp[40],p[40],MAX,sum[40]; bool flag[40]; void dfs(double x,int k) { if(x>V) return ; if(x>MAX) MAX=x; if(k>N) return ; if(x+sum[k]<=MAX) return; // printf("%.2lf\n",x); // flag[k]=1; dfs(x+p[k],k+1); // flag[k]=0; dfs(x,k+1); } int main() { int i,j,k,n; while(scanf("%lf%d",&V,&n),n) { int num,flag; double A,B,C,tmp,tsum; char ch; N=0; for(i=1;i<=n;i++) { flag=1;tsum=0; A=B=C=0; scanf("%d",&num); for(j=1;j<=num;j++) { getchar(); scanf("%c:%lf",&ch,&tmp); tsum+=tmp; if(ch=='A') A+=tmp; else if(ch=='B') B+=tmp; else if(ch=='C') C+=tmp; else flag=0; } if(tsum>1000||A>600||B>600||C>600) flag=0; if(flag) p[++N]=tsum; } // for(i=1;i<=N;i++) printf("%.2lf ",p[i]); printf("\n\n"); sum[N]=p[N]; for(i=N-1;i>=1;i--){ sum[i]=sum[i+1]+p[i]; } memset(dp,0,sizeof(dp)); MAX=0; dfs(0,1); printf("%.2lf\n",MAX); } return 0; }