大华2018软件大赛模拟赛第四题

上一篇博客写了一下哈夫曼编码,并且传了某比赛的代码。这里顺便再发一下另外一道题目。

某股票操盘手账户里有N支股票,股价互不等,分别为v1,v2...vn;每支股票的持有股数为m1,m2...mn。现在操盘手要回笼资金需要卖出股票,假设卖出价格即为当前股价,请问能回笼多少种不同的资金量。比如:两支股票,股价分别为10、11,数量为1、2,则能回笼0、10、11、22、21、32,总共6种资金量

Input:
1
2
10 11
1 2
Output:
6

这个问题就是称砝码变来的。发这道题目的目的主要是,官方后来给出的答案不是利用递归实现的,虽然非递归往往效率要高于递归,但是个人习惯还是倾向于递归。一般的递归函数数学上更加直观,对初学者来说会比较友好。但是非递归函数对于逻辑性不强的,可能就搞不懂里面道理在for什么东西(当年学算法的时候,很多动态规划问题我是迷迷糊糊的)。当然这只是个人看法。

下面上这道题目的代码:

#include<iostream>
#include<vector>
using namespace std;
//计算当前容器内的总价值
int sumValue(vector<int> currect_val)
{
	int val = 0;
	for (int i = 0; i < currect_val.size();i++)
	{
		val = val + currect_val[i];
	}
	return val;
}
//插入新的价值到容器中;
//vector<int> val_output为价值容器
//int val为带插入的价值
//这里也可以用find函数,之前有点忘了容器的一些用法,就自己写了
vector<int> insertValue(vector<int> val_output, int val)
{
	int i;
	for (i = 0; i < val_output.size();i++)
	{
		//重复就不插入
		if (val_output[i]==val)
		{
			return val_output;
		}
	}
	val_output.push_back(val);
	return val_output;
}


void calculateValue(vector<int> currect_val, vector<int> &val_output)
{
	int current_sum_val = 0;
	if (currect_val.size() == 0)
	{
		return;
	}
	current_sum_val = sumValue(currect_val);
	//cout << current_sum_val << endl;
	val_output = insertValue(val_output, current_sum_val);
	for (int i = 0; i < currect_val.size(); i++)
	{
		vector<int> temp(currect_val);	
		temp.erase(temp.begin() + i);   //删除第i个元素,继续向下调用
		calculateValue(temp, val_output);
	}
}
int main()
{
	vector<int> val_output;//用于管理回笼资金的种类
	int T = 0,n;
	cin >> T;
	vector<int> output;
	for (int i = 0; i < T; i++)
	{
		cin >> n;
		int *value = new int[n];
		int *count = new int[n];
		int val_n = 0;//总的股票票数
		vector<int> val_all;//把股票一个一个分别放进容器,数量>1的按照数量计算
		for (int j = 0; j < n; j++)
		{
			cin >> value[j];
		}
		for (int j = 0; j < n; j++)
		{
			cin >> count[j];
		}

		for (int i = 0; i < n; i++)
		{
			val_n = val_n + count[i];
		}
		
		//下面这个循环要做的就是把所有股票放进容器,大于1的按照个数计算
		//然后调用递归函数calculateValue,每次删除一个
		for (int j = 0; j < n; j++)
		{
			for (int k = 0; k < count[j]; k++)
			{
				val_all.push_back(value[j]);
				//val_index++;
			}
		}
		calculateValue(val_all, val_output);
		val_output = insertValue(val_output, 0);
		output.push_back(val_output.size());
		val_output.clear();
	}

	
	for (int index = 0; index < T; index++)
	{
		cout << output[index] << endl;
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/h294455907/article/details/80241882
今日推荐