标签:
其实回溯挺简单的就是暴力+判断条件,条件成立继续暴力,条件不成立就返回下一个暴力,难点就是找成立的条件,
在我看来回溯就是暴力的剪枝,找出成立的条件问题就基本解决了。。。
思路:
这道题应该找到当前的乘车顺序及人数能否乘上车,,,我用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