poj1404题解
来源:互联网 发布:算法实现约瑟夫环c语言 编辑:程序博客网 时间:2024/05/19 13:43
来源:http://poj.org/problem?id=1040
思路:dfs
代码:
#include <stdio.h>#include <string.h>int z,n,m,s[30],t[30],w[30],e[30],g[8],max;//s,t数组分别记录订单的起点和终点,w数组记录订单的人数,e数组记录订单的利润,g数组记录第i个车站的人数void dfs(int dep,int p)//搜索dep个订单,此时的利润为p{ int i; if(p>max) max=p; if(dep>=m) return; for(i=s[dep];i<t[dep];i++) if(g[i]+w[dep]>z) break; //如果i>=t[dep]则说明第s到t原有的人数加上第dep个订单的人数不大于载客量 if(i>=t[dep]) { for(i=s[dep];i<t[dep];i++) g[i]+=w[dep]; dfs(dep+1,p+e[dep]); for(i=s[dep];i<t[dep];i++) g[i]-=w[dep]; } dfs(dep+1,p);}int main(){ while(scanf("%d%d%d",&z,&n,&m),z||n||m) { memset(g,0,sizeof(g)); for(int i=0;i<m;i++) { scanf("%d%d%d",&s[i],&t[i],&w[i]); e[i]=w[i]*(t[i]-s[i]); } max=0;//储存最大利润 dfs(0,0); printf("%d\n",max); } return 0;}
0 0