UVA301

输入第一行,是车的限载人数 ,站点的数量 ,订单的数量。

接下来是每个订单的内容,从哪站 到 哪站 有几个人。

订单可以选择接或者不接,要求是不能超载,一个人一站是一块钱,问怎么接订单钱最多。。

首先先用一个结构体把订单存下来,然后开始回溯,用一个数组num记录到达每一站时的人数,然后一个一个订单遍历(注意不是一个一个站遍历)

判断是如果接了这个订单 ,比如这个订单是从1 - 3的。那么num[1] 也就是站点1现在的人数加上订单人数会不会超  num[2] num[3]也是,判断会不会超载,

如果都不会,就把钱加上,订单位置加一,递归,然后不接受订单的情况也递归(这时需要把每个站已经加上的人在减掉)。


AC代码:

#include <stdio.h>  

struct order {
	int s;
	int e;
	int people;
}ord[25];

int num[10];  
int limit,m,n,max = 0;;
void search(int pos, int money)  {  
    if(pos == m)  {  
        if(max < money) max = money;  
        return;  
    }  
    int ok = 1;
	int	choose[10] = {0};  
    for(int i = ord[pos].s; i < ord[pos].e; i++)  {  
        if( num[i] + ord[pos].people <= limit) {
		   	num[i] += ord[pos].people;
		   	choose[i] = 1;
	   	}  
        else {
			ok = 0;
		   	break;
		}  
    }  
    if(ok) {
		search(pos + 1, money + (ord[pos].e-ord[pos].s) * ord[pos].people);
	}  
    for(int i = 0; i <= n; i++) 
		if(choose[i])
		   	num[i]-=ord[pos].people;  
    search(pos + 1,money);  
}  
int main () {  
    while(scanf("%d%d%d", &limit , &n , &m)) {  
		if (limit == 0)
			break;
        for(int i = 0; i < m; i++)  
            scanf("%d%d%d", &ord[i].s, &ord[i].e,&ord[i].people);  
        max = 0;  
        search(0, 0);  
        printf("%d\n",max);  
    }  
    return 0;  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值