简单的深搜题。
果然题目做得越多越有感觉。。
只要把每一个账单是否取搜一遍就行。取的时候看下满足不满足条件。
#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; }