uva 301 Transportation(回溯)

来源:互联网 发布:阿里云客服如何联系 编辑:程序博客网 时间:2024/06/06 11:02

其实回溯挺简单的就是暴力+判断条件,条件成立继续暴力,条件不成立就返回下一个暴力,难点就是找成立的条件,

在我看来回溯就是暴力的剪枝,找出成立的条件问题就基本解决了。。。

思路:

这道题应该找到当前的乘车顺序及人数能否乘上车,,,我用num数组标记了每个车站的人数

贴代码:

#include<stdio.h>#include<string.h>#include<stdlib.h>int num[10];struct {int x,y,nu;}node[30];int m,cnt,max,n,sum;void solve(int t){for(int i=t; i<m; i++){int flag = 0;for(int k=node[i].x; k<node[i].y; k++){if(num[k]+node[i].nu > sum){flag = 1;break;}}if(flag == 0){for(int k=node[i].x; k<node[i].y; k++){num[k]+=node[i].nu;}cnt += (node[i].y - node[i].x)*node[i].nu;if(cnt > max)max = cnt;solve(i+1);for(int k=node[i].x; k<node[i].y; k++){num[k]-=node[i].nu;}cnt -= (node[i].y - node[i].x)*node[i].nu;}}return ;}int main(){int i;while(scanf("%d%d%d",&sum,&n,&m),n||m||sum){max = cnt = 0;memset(num,0,sizeof(num));memset(node,0,sizeof(node));for(i=0; i<m; i++){scanf("%d%d%d",&node[i].x,&node[i].y,&node[i].nu);}solve(0);printf("%d\n",max);}}


0 0
原创粉丝点击