码迷,mamicode.com
首页 > 其他好文 > 详细

uva 301 Transportation(回溯)

时间:2015-07-28 13:08:22      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

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

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

思路:

这道题应该找到当前的乘车顺序及人数能否乘上车,,,我用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);
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

uva 301 Transportation(回溯)

标签:

原文地址:http://blog.csdn.net/sinat_22659021/article/details/47102655

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!