当前位置: 首页 > news >正文

华为面试2:1分2分5分的硬币,组成1角,共有多少种组合。

动态规划,注意不要有重复的,例如组成1角钱,5 2 2 1 和 1 2 2 5是1种组合

算法的设计思想在程序中注释的很清楚。

解法一:

// 动态规划
// total_money: 要找的零钱总和
// changes: 零钱数组,已经从小到大排序,第1个元素设为0,有效元素从第2个位置即下标1开始
// kinds_change: 零钱种类
int make_change_problem(int total_money, int *changes, int kinds_change)
{
    // opt[i][j]表示用前j种零钱组成i元钱的组合数目,第j种零钱的数目可以为0
    boost::multi_array<int, 2> opt(boost::extents[total_money+1][kinds_change+1]);
    int i, j;
	// 组成0元钱的组合数目只有1种,即不选择任何零钱
    i = 0;
    for (j = 0; j <= kinds_change; ++j)
        opt[i][j] = 1;
	// 用0种零钱组成i(1<=i<=total_money)元钱的组合数目是0
    j = 0;
    for (i = 1; i <= total_money; ++i)
        opt[i][j] = 0;
    for (i = 1; i <= total_money; ++i)
    {
        for (j = 1; j <= kinds_change; ++j)
        {
            opt[i][j] = 0;
            int K = i / changes[j]; // 第j种零钱的最大数目
            for (int k = 0; k <= K; ++k)
                opt[i][j] += opt[i-k*changes[j]][j-1];
        }
    }
    return opt[total_money][kinds_change];
}

int main(int argc, char **argv)
{
    int total_money = 10;
    int changes[] = {0, 1, 2, 5};
    int kinds_change = sizeof(changes) / sizeof(int) - 1;
    int number;
    number = make_change_problem(total_money, changes, kinds_change);
    cout << number << endl;
    return 0;
}


解法二:

// total_money: 要找的零钱总和
// changes: 零钱数组,已经从小到大排序,第1个元素设为0,有效元素从第2个位置即下标1开始
// kinds_change: 零钱种类
int make_change_problem_v2(int total_money, int *changes, int kinds_change)
{
	// opt[i]表示i元钱的组合数目
	std::vector<int> opt(total_money+1, 0);
	
	// 组成0元钱的组合数目只有1种,即不选择任何零钱
	opt[0] = 1;
	
	// 第一个循环计算包含第i种零钱时j元钱的组合数目,第二个循环计算j(j>=changes[i])元钱的组合数目
	for (int i = 1; i <= kinds_change; ++i)
	{
		for (int j = changes[i]; j <= total_money; ++j)
		{
			opt[j] += opt[j-changes[i]];
		}
	}
	return opt[total_money];
}
 
 

转载于:https://www.cnblogs.com/iamzhaiwei/archive/2012/07/05/2689663.html

相关文章:

  • HTML5 Canvas 血战消除游戏[连连看]
  • 根据进程启动时间进行kill
  • ORACLE——Instant Client配置SQL*LDR、EXP等命令工具
  • Android系统的开机画面显示过程分析(13)
  • Android HttpURLConnection应用技巧分享
  • 【WindowsAPI之MoveWindow】 C#调整目标窗体的位置、大小
  • [转载] Discrete Mathematics——11 群的概念和性质
  • throw与throws的范例
  • 【A - ECJTU_ACM 11级队员2012年暑假训练赛(2)】
  • 【原】Unity3D之IOS Document
  • PHP简单去掉文件里面的空行和重复行
  • 蚂蚁变大象:浅谈常规网站是如何从小变大的zz
  • 客户博客:现在在云端,使用Sitecore和Windows Azure进行Web Content管理和创作
  • 【AS3代码】翻牌游戏源码
  • getIdentifer()函数的用法
  • $translatePartialLoader加载失败及解决方式
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • android图片蒙层
  • es的写入过程
  • Idea+maven+scala构建包并在spark on yarn 运行
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • MySQL的数据类型
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • tab.js分享及浏览器兼容性问题汇总
  • 服务器之间,相同帐号,实现免密钥登录
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 记录一下第一次使用npm
  • 聊聊sentinel的DegradeSlot
  • 如何使用 JavaScript 解析 URL
  • 想写好前端,先练好内功
  •  一套莫尔斯电报听写、翻译系统
  • Semaphore
  • #include到底该写在哪
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (五)c52学习之旅-静态数码管
  • (小白学Java)Java简介和基本配置
  • ***检测工具之RKHunter AIDE
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .form文件_SSM框架文件上传篇
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .net程序集学习心得
  • .Net接口调试与案例
  • .NET企业级应用架构设计系列之结尾篇
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • .Net转前端开发-启航篇,如何定制博客园主题
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @RequestMapping处理请求异常
  • [] 与 [[]], -gt 与 > 的比较