标签:
其实回溯挺简单的就是暴力+判断条件,条件成立继续暴力,条件不成立就返回下一个暴力,难点就是找成立的条件,
在我看来回溯就是暴力的剪枝,找出成立的条件问题就基本解决了。。。
思路:
这道题应该找到当前的乘车顺序及人数能否乘上车,,,我用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); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/sinat_22659021/article/details/47102655