华为机试:最优策略组合下的总的系统消耗资源数

题目描述

在通信系统中,一个常见的问题是对用户进行不同策略的调度,会得到不同的系统消耗和性能。
假设当前有n个待串行调度用户,每个用户可以使用A/B/C三种不同的策略,不同的策略会消耗不同的系统资源。请你根据如下规则进行用户调度,并返回总的消耗资源数。
规则:
1.相邻的用户不能使用相同的调度策略,例如,第一个用户使用了策略A,则第二个用户只能使用B或者C策略。
2.对单个用户而言,不同的调度策略对系统资源的消耗可以归一化为抽象数值。例如,某用户分别使用A/B/C的略的消耗分别为 15/8/17。
3.每个用户依次选择当前所能选择的对系统资源消耗最少的策略(局部最优),如果有多个满足要求的策略,选最后一个。

输入描述

第一行表示用户个数N。
接下来表示每一行表示一个用户分别使用三个策略的资源消耗,resA resB resC。

输出描述

最优策略组合下的总的系统消耗资源数。

示例1

输入

3
15 8 17
12 20 9
11 7 5

输出

24
说明:

1号用户使用B策略
2号用户使用C策略
3号用户使用B策略
系统资源消耗8+9+7。

思路

使用回溯算法求最优解

参考代码

int min = 65535;				// 将min设定成最大值,不过定义这个值时需要斟酌,有一定的风险
int cnt = 0;
int resource[1000][3];

/*
 使用回溯算法求最优解
 ※回溯的本质就是一个暴力穷举的算法,通常情况下回溯的部分是在递归函数的下面
*/ 
void backtrack(int deep, int idx, int num)
{
	int i;
	if (deep == num - 1)			// 满足条件后,记录完最小值后退出
	{
		/*
		 如果直接用min有风险,则可以使用一个数组装入所有组合的数,
		 然后在最外面排序后输出,不过数组的大小定义仍需要斟酌
		*/
		min = min < cnt ? min : cnt;	
		return;
	}
	deep++;

	for (i = 0; i < 3; i++)
	{
		if (i == idx)	continue;	// 上一用户使用过的策略,本用户不能使用
		
		cnt += resource[deep][i];	// 计算资源消耗数
		backtrack(deep, i, num);	// 递归调用
		cnt -= resource[deep][i];	// 回溯,取消本次计算,进行下一用户的计算
	}
}

int main(void)
{
	int n, i;

	scanf("%d", &n);
	for (i = 0; i < n; i++)
	{
		scanf("%d %d %d", &resource[i][0], &resource[i][1], &resource[i][2]);
	}

	backtrack(-1, -1, n);
	printf("%d", min);
	return 0;
}
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值