UVa391

简单的深搜题。

果然题目做得越多越有感觉。。

只要把每一个账单是否取搜一遍就行。取的时候看下满足不满足条件。

#include<stdio.h>
#include<string.h>
#define MAX 23
struct node{
	int start,end;
	int people;
}train[MAX];
int station[8];
int vis[MAX];
int passengers,maxvalue,orders,b_station;
int judge(void){
	int i;
	for(i=0;i<=b_station;i++)
		if(station[i]>passengers)
			return 0;
	return 1;
}
void dfs(int n,int max){
	int i,j;
	if(n==orders){
		if(max>maxvalue)
			maxvalue=max;
	}
	else{
		for(i=0;i<2;i++){
		vis[n]=i;
		for(j=train[n].start;j<train[n].end;j++)
			station[j]+=vis[n]*train[n].people;
		if(judge())
			dfs(n+1,max+(train[n].end-train[n].start)*train[n].people*vis[n]);
		for(j=train[n].start;j<train[n].end;j++)
			station[j]-=vis[n]*train[n].people;
		}
	}
}
int main()
{
	int i;
	while(scanf("%d%d%d",&passengers,&b_station,&orders)!=EOF&&(passengers||orders||b_station)){
		memset(station,0,sizeof(station));
		for(i=0;i<orders;i++){
			scanf("%d%d%d",&train[i].start,&train[i].end,&train[i].people);
		}
		maxvalue=0;
		dfs(0,0);
		printf("%d\n",maxvalue);
	}
	return 0;
}


你可能感兴趣的:(UVa391)