/* 推荐题型:四星 题意:从A到B,接受那些订单可使船的受益最大。要求订单要么完全接受,要么完全拒绝 思路:子类枚举,回溯 回溯概念:在递归构造过程中,生成和检查过程有机结合起来,从而减少不必要的枚举。并不仅仅是指将状态恢复到原来的情况。 */ #include <cstdio> #include <cstdlib> #include <cstring> int n1,n2,n3; struct Node { int a; int b; int n; }node[25]; int p[10]; int ans; int cmp(const void *a,const void *b) { Node *pa=(Node *)a; Node *pb=(Node *)b; return pa->n-pb->n; } void dfs(int cur) { if(cur==n3) { int temp=0; for(int i=0;i<10;i++) temp+=p[i]; if(temp>ans) ans=temp; return; } bool ok=true; int pp[10]; memcpy(pp,p,sizeof(p)); for(int i=node[cur].a;i<node[cur].b;i++) { pp[i]+=node[cur].n; if(pp[i]>n1) { ok=false; break; } } dfs(cur+1); if(ok) { memcpy(p,pp,sizeof(pp)); dfs(cur+1); } } int main() { //freopen("data.in","r",stdin); while(scanf("%d %d %d",&n1,&n2,&n3)==3) { if(n1==0 && n2==0 && n3==0) break; for(int i=0;i<n3;i++) { scanf("%d %d %d",&node[i].a,&node[i].b,&node[i].n); } qsort(node,n3,sizeof(node[0]),cmp); memset(p,0,sizeof(p)); ans=0; dfs(0); printf("%d\n",ans); } return 0; }/* 二进制法求子类枚举,结果超时。 */ #include <cstdio> #include <cstdlib> #include <cstring> int n1,n2,n3; struct Node { int a; int b; int n; }node[25]; int ans; int cmp(const void *a,const void *b) { Node *pa=(Node *)a; Node *pb=(Node *)b; return pa->n-pb->n; } void dfs(int s) { bool ok=true; int p[10]; memset(p,0,sizeof(p)); for(int i=0;i<n3;i++) if(s & 1<<i) { for(int j=node[i].a;j<node[i].b;j++) { p[j]+=node[i].n; if(p[j]>n1) { ok=false; return; } } } if(ok) { int temp=0; for(int i=0;i<10;i++) temp+=p[i]; if(temp>ans) ans=temp; return; } } int main() { //freopen("data.in","r",stdin); while(scanf("%d %d %d",&n1,&n2,&n3)==3) { if(n1==0 && n2==0 && n3==0) break; for(int i=0;i<n3;i++) { scanf("%d %d %d",&node[i].a,&node[i].b,&node[i].n); } qsort(node,n3,sizeof(node[0]),cmp); ans=0; for(int i=0;i<(1<<n3);i++) dfs(i); printf("%d\n",ans); } return 0; }
301 Transportation(****)
最新推荐文章于 2022-06-10 10:50:14 发布