题解 友情链接~
同一个方法做的
#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;
}

594

被折叠的 条评论
为什么被折叠?



