2017笔试编程之砝码称重~
2017-07-27 00:14
267 查看
时间:2017/7/27
事件:参与了某公司的笔试,遇到一编程题,感觉挺有趣哒,选择记录下来,题目记不完全,但是努力回想~
题目内容:有2个砝码,分别为1kg,2kg(各一个),则一共可以称重的情况有3种,即{1,1},{2,1},{3,1}【注:第一个元素为称重重量,第二个元素为组成方案】; 再举个例子,有3个砝码,分别为1kg,2kg,3kg(各一个),则一共可以称重的情况有6种,即{1,1},{2,1},{3,2},{4,1},{5,1},{6,1}【注:第一个元素 为称重重量,第二个元素为组成方案,例如3kg的砝码可以由一个3kg或者一个1kg和一个2kg组成】;
思路如下:不难看出这是个求子集的问题,把每个子集求出来,在进行子集元素相加即可,然后呢,进一步分析可以得到,每个组的元素一是肯定不会重复的,然后元素二就相当于它所对应的计数器,嗷呜~ 有木有觉得这用map棒棒的~ 嘿嘿,map的key值存和,value值存和的计数器~
代码如下:
事件:参与了某公司的笔试,遇到一编程题,感觉挺有趣哒,选择记录下来,题目记不完全,但是努力回想~
题目内容:有2个砝码,分别为1kg,2kg(各一个),则一共可以称重的情况有3种,即{1,1},{2,1},{3,1}【注:第一个元素为称重重量,第二个元素为组成方案】; 再举个例子,有3个砝码,分别为1kg,2kg,3kg(各一个),则一共可以称重的情况有6种,即{1,1},{2,1},{3,2},{4,1},{5,1},{6,1}【注:第一个元素 为称重重量,第二个元素为组成方案,例如3kg的砝码可以由一个3kg或者一个1kg和一个2kg组成】;
思路如下:不难看出这是个求子集的问题,把每个子集求出来,在进行子集元素相加即可,然后呢,进一步分析可以得到,每个组的元素一是肯定不会重复的,然后元素二就相当于它所对应的计数器,嗷呜~ 有木有觉得这用map棒棒的~ 嘿嘿,map的key值存和,value值存和的计数器~
代码如下:
#include<iostream> #include<map> using namespace std; map<int,int> map1; void Insert(int value) //插入函数 { if(value > 0) //因为不考虑空集,所以value=0的时候,不进行插入 { map<int,int>::iterator it = map1.begin(); for(;it!=map1.end();++it) { if(it->first == value) //如果map里面已经有其值 { it->second += 1; //那给它对应的计数器加上1即可 } } if(it == map1.end()) //如果map里面没有那个值,则进行map的键值对插入操作 { map1.insert(pair<int,int>(value,1)); } } } void Item(int *array,int *pos,int len,int cur) //求子集的递归函数,pos数组是标识位数组,默认全是0,len是数组长度,cur是标记为数字 { int tmp = 0; if(cur == len)//则表示len个数字已经置好值,可以进行统计啦 { for (int i=0;i<len;i++) { if (pos[i]) //为真,则表示这个位置的数字需要 { tmp += array[i]; } } Insert(tmp); } else { pos[cur]=1; //这一位选 Item(array,pos,len,cur+1); //递归下一位 pos[cur]=0; //这一位不选 Item(array,pos,len,cur+1); //递归下一位 } } void Item(int *array,int len,int cur) //马甲函数,方便调用 { int *pos = new int[len]; Item(array,pos,len,0); delete[] pos; } void fun(int *array,int length) { Item(array,length,0); //函数调用 cout<<map1.size()<<endl; map<int,int>::iterator at = map1.begin(); for(;at!=map1.end();++at)//进行打印 { cout<<at->first<<" "<<at->second<<endl; } } int main() { int num = 0; cin >> num; int *fama = new int[num]; for(int i=0;i<num;++i) { cin>>fama[i]; } fun(fama,num); delete[] fama; return 0; }总结:可能有更好的办法吧,嘿嘿,不过能学以致用,很开心啦,一直在努力,从不言放弃。加油~
相关文章推荐
- 腾讯2017秋招编程笔试题
- 2017微软秋季校园招聘在线编程笔试 Composition
- 2017奇虎360春招笔试编程
- 求连续子数组的最大和---2017滴滴笔试编程1
- 2017微软秋季校园招聘在线编程笔试(第一题)
- 2017内推笔试编程(二)
- 2017微软秋季校园招聘在线编程笔试(第二题)
- 《网易游戏2017互娱》实习笔试编程一:竖式填空
- 2017吉比特校招一个编程笔试题
- 2017美团点评秋招笔试编程
- 2017微软秋季校园招聘在线编程笔试(第三题)
- 2017微软秋季校园招聘在线编程笔试-#1399 : Shortening Sequence
- 网易游戏2017互娱实习笔试编程--竖式填空
- 腾讯2017秋招笔试编程
- 2017 小米笔试题 编程题 求树的高度 Java代码实现
- 阿里2017前端实习生笔试编程第一题
- 美团点评2017秋招笔试编程
- 2017微软秋季校园招聘在线编程笔试 Composition (DP)
- 网易2017笔试 编程题目
- 2017微软秋季校园招聘在线编程笔试