上一篇博客写了一下哈夫曼编码,并且传了某比赛的代码。这里顺便再发一下另外一道题目。
某股票操盘手账户里有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; }