hdu1864 最大报销额

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;
}



你可能感兴趣的:(hdu1864 最大报销额)