1.假如你有数枚硬币,在已知这些硬币的面值和每种面值有几枚时,随机从这些硬币中取出几枚硬币可能的和有多少种?(谷歌笔试题)

  • 记硬币的面值为coins=[10,50,100],其相应面值的枚数为quantity=[1,2,1]
  • 则:

    • 50 = 50
    • 10 + 50 = 60
    • 50 + 100 = 150
    • 10 + 50 + 100 = 160
    • 50 + 50 = 100
    • 10 + 50 + 50 = 110
    • 50 + 50 + 100 = 200
    • 10 + 50 + 50 + 100 = 210
    • 10 = 10
    • 100 = 100
    • 10 + 100 = 110
  • 从上面可以看出来总共有9中不同的和.
  • 整理思路:从上面的求和过程可以看出,单个硬币的枚数依次加入到每一种和中,取不同的值,可以把最终的和的取值放在一个元素单一的数据结构类型中,如C++或者Python中的set数据类型。

    • 0 = 0
    • 10 = 10
    • iiiiiiiiiiiiiiiiiiii
    • 0 + 50 = 50
    • 10 + 50 = 60
    • iiiiiiiiiiiiiiiiiiiiiiiiiii
    • 0 + 50 = 50
    • 10 + 50 = 60
    • 50 + 50 = 100
    • 60 + 50 = 110
    • iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
    • 0 + 100 = 100
    • 10 + 100 = 110
    • 50 + 100 = 150
    • 60 + 100 = 160
    • 50 + 100 = 150
    • 60 + 100 = 160
    • 100 + 100 = 200
    • 110 + 100 = 210

    为了减少重复运算的次数,从数量最多的硬币面值开始迭代,每一枚硬币都对已经取得的所有和求和并放至保存和的容器中。

  • 验证代码(python)

    def possibleSums(coins, quantity):
    p=max(quantity)
    maxIndex=quantity.index(p)
    b=set([coins[maxIndex]*x for x in xrange(p+1)])
    for i in range(len(coins)):if i!=maxIndex:for j in xrange(quantity[i]):d=b.copy()for k in b:d.add(k+coins[i])b=d
    return len(b)-1                
  • 提交代码(C++)

    int getMaxPos(std::vector<int>vec){
    int maxPos=0;
    int a=vec[maxPos];
    for(size_t i=1;i<vec.size();i++){if(a<vec[i]){maxPos=i;a=vec[maxPos];}
    }
    return maxPos;
    }
    int possibleSums(std::vector<int> coins, std::vector<int> quantity) {int maxPos=getMaxPos(quantity);int maxV=quantity[maxPos];std::set<int>sum;for(int i =0;i<maxV+1;i++){sum.insert(i*coins[maxPos]);}for(int i=0;i<coins.size();i++){if(i!=maxPos){for(int j=1;j<=quantity[i];j++){std::set<int>temSum=sum;for(std::set<int>::iterator it=sum.begin();it!=sum.end();it++){temSum.insert(*it+coins[i]);}sum=temSum;}}}return (sum.size()-1);
    }

  • refer

[1] https://codefights.com/interview-practice/task/rMe9ypPJkXgk3MHhZ

[2] http://www.cplusplus.com/reference/set/set/operator=/

PossibleSums相关推荐

  1. python硬币多少组合方式_硬币组合的完全搜索算法

    这个问题类似于硬币兑换问题,但有点不同.在 问题是这样说的:你有一套硬币,你知道硬币的价值和每种硬币的数量.你想知道你能从这些硬币的非空分组中得到多少不同的总数.在 例如coins = [1, 2, ...

最新文章

  1. 马斯克的星辰大海,还在继续。“月球电梯,我来啦”
  2. python面向对象编程的优点-Python 基础知识----面向对象编程
  3. MVCC在MySQL的InnoDB中的实现
  4. 在Windows Media Center中收听超过100,000个广播电台
  5. C# VS生成后事件命令行
  6. Kubernetes 稳定性保障手册(极简版)
  7. 创建寄宿在Windows服务中的WCF服务
  8. 5G 十项全能、搭载麒麟 820 芯片,1899 元起的荣耀 X10 来了!
  9. SDUT OJ 顺序表应用3:元素位置互换之移位算法
  10. 卧槽!我的IDEA中XML显示屎黄色,怎么去掉?
  11. layui登录源码_基于springboot+thymeleaf+mysql+layui实现的论坛系统
  12. matlab函数imhist执行错误可能因为图像不是灰度的
  13. 工作流引擎的流程业务表设计
  14. 符号---Alt+数字键
  15. 程序员女朋友礼物python代码_程序员到底该怎么给女朋友挑礼物
  16. 日程提醒app android,手机里有提醒日程安排的软件吗?
  17. [国家集训队]阿狸和桃子的游戏(贪心)
  18. Windows Shell编程-第十章.Winows辅助库
  19. 2022,2021英语六级全套资料自提,阿里云网盘链接,不限速度
  20. 笔耕不缀,学无止境|报名参加CCTC的八大理由

热门文章

  1. 牛客国庆集训派对Day3: I. Metropolis(dijkstra)
  2. Ubuntu中需要安装的
  3. 原生中文版MyBB开源论坛效果展示
  4. js中WINDOW对象中的location成员对象
  5. 读《我在未来等你》有感
  6. zynq文档学习之GPIO和MIO和EMIO的基本介绍
  7. 简单Matlab的Gui设计——电子琴
  8. 信息论和贝叶斯(或许会继续补充)
  9. MFC_选择目录对话框_选择文件对话框_指定目录遍历文件
  10. HTML中的几种空格