最大报销额 HDU 1864

//用dfs做的,但是正解似乎是dp
//http://acm.hdu.edu.cn/showproblem.php?pid=1864

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
vector<double> v;
double ans,price;
int n;
void dfs(double sum,int t);
int main(){
	scanf("%lf%d",&price,&n);
//	cout<<n<<endl;
	double ss=0;
	while(n){
		ans=0,ss=0;
		v.clear();
		while(n--){
			int m,flag=1;
	    	char type;
	    	double p,sum=0,a=0,b=0,c=0;
	    	scanf("%d",&m);
	    	getchar();
	    	for(int i=0;i<m;i++){
	    		scanf("%c:%lf",&type,&p);
	    //		cout<<type<<endl;
	    		getchar();
	    		if(type=='A'){
	     			a+=p;
	    			sum+=p;
		    	}
		    	else if(type=='B'){
		    		b+=p;
		    		sum+=p;
		    	}
		    	else if(type=='C'){
		    		c+=p;
		     		sum+=p;
		    	}
		    	else{
		    		flag=0;
		    	}
	    	}
	    	if(sum>1000||(a>600)||(b>600)||(c>600)) continue;
	    	if(!flag) continue;
	    	if(sum>price) continue;
	//    	cout<<sum<<endl;
	    	v.push_back(sum);
	    	ss+=sum;
	   	}
//	   	cout<<ss<<endl;
	   	if(ss<=price){
	   		printf("%.2lf\n",ss);
	   	}
	   	else{
	   	   dfs(0,-1);	
	   	   printf("%.2lf\n",ans);
	   	}
	   	scanf("%lf%d",&price,&n);
	}
}

void dfs(double sum,int t){
//	cout<<sum<<' '<<t<<endl;
	if(sum>price) {
		return ;
	}
	if(ans<sum){
		ans=sum;
	}
	for(int i=t+1;i<v.size();i++){
		dfs(sum+v[i],i);
	}
	return ;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值