笔试题:硬币划分

硬币划分

问题描述:

有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱(n <= 100000),有多少中组合可以组成n分钱?

思路分析:

  1. 穷举法
int countWays(int n) {
    int count = 1;          // 全用1分的情况
    for(int a1 = 0; a1 < n/10; a1++) {
        int b1 = 10 * a1;
        for(int a2 = 0; a2 <= n/5; a2++) {
            int b2 = 5* a2;
            for(int a3=0; a3<=n/2; a3++) {
                count++;
            }
        }
    }
    return count;
}
  1. 动态规划

我们假设用m种纸币构成sum分:\(sum = x_1*V_1 + x_2*V2 + ... + x_m*V_m\)
\(V_m\)的系数的取值可分为 \(\lbrace0, 1, 2, ..., sum/V_m\rbrace\) :

\[ sum = x_1*V_1 + x_2*V2 + ... + (0|1|2|3...|K)*V_m \]

\[K = sum/V_m\]

定义dp[i][sum] = 用前i种硬币构成sum的所有集合数

当 \(x_m=0\) 时,实际上就是前i-1种纸币组合sum,有dp[i-1][sum]种组合,所以:

\[ dp[i][sum] = dp[i-1][sum-0*V_m] + dp[i-1][sum-1*V_m] + ... + dp[i-1][sum-K*V_m] \]
\[ K = sum/V_m \]

对应的数学描述是:
\[ dp[i][sum] = \sum_{k=0}^{sum/V_m} dp[i-1][sum-K*V_m] \]

如果我们用二位数组表示dp[i][sum], 我们发现第i行的值全部依赖与i-1行的值,所以我们可以逐行求解该数组。如果前0种纸币要组成sum:dp[0][sum] = 0

int countWays(int n){
    int money[] = {1, 2, 5, 10};
    int dp[] = new int[n+1];
    dp[0] = 0;
    for(int i = 0; i < money.len; i++){
        for(int j = 0; j <= n; j++){
            dp[j] = dp[j] + dp[j - dp[i]];
        }
    }
    return dp[n];
}

原文地址:https://www.cnblogs.com/wuxie0ne/p/11603807.html

时间: 2024-08-01 21:24:57

笔试题:硬币划分的相关文章

笔试题系列001

测试笔试题类型:软件测试| 试题:55道试题(50道选择题,5道问答题)http://bbs.sjtu.edu.cn/bbsanc,path,%2Fgroups%2FGROUP_9%2FJobInfo%2FD7CD26755%2FD85486036%2FM.1131274669.A.html http://202.197.191.206:8080/38/text/test/test_2/shijuan2.htm 软件工程 http://test.examw.com/410/P6517/一.单选题

C/C++ 笔试题一

摘自 网络上的 笔试题,据说是华为的,考察的内容还算全面,也很细致: 答案 疏略 检查了下,应该没有什么大问题,但是 还是那句话,尽信之不如无,所以还是要自己思考 1.static有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其它函数访问.它是一个本地的全局变量. 3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用.那就是,这

笔试题集锦(智力题)

一.简答题 1. 动态链接库和静态链接库的优缺点 2. 轮询任务调度和可抢占式调度有什么区别? 3. 列出数据库中常用的锁及其应用场景 二.算法设计题 1. 给定N是一个正整数,求比N大的最小"不重复数",这里的不重复是指没有两个相等的相邻位,如1102中的11是相等的两个相邻位故不是不重复数,而12301是不重复数. 2. 设N是一个大整数,求长度为N的字符串的最长回文子串. 3. 坐标轴上从左到右依次的点为a[0].a[1].a[2]--a[n-1],设一根木棒的长度为L,求L最多

C++经典笔试题详解

1.static有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问.它是一个本地的全局变量. 3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用.那就是,这个函数被限制在声明它的模块的本地范围内使用 2.引用与指针有什么区别? 1) 引用必须被初始化,指针不必. 2) 引用初始化以后不能被改变,指针可以改变所指的对象.

嵌入式Linux C笔试题积累(转)

http://blog.csdn.net/h_armony/article/details/6764811 1.   嵌入式系统中断服务子程序(ISR) 中断是嵌入式系统中重要的组成部分,这导致了很 多编译开发商提供一种扩展—让标准C支持中断.具代表事实是,产生了一个新的关键字 __interrupt.下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的. __interrupt double compute_area (double radi

阿里笔试题记录(Android客户端部分)

阿里笔试题记录(Android客户端部分) 选择题 结果应该是选择 80,8 思路: - 指针的值都是一个个地址,而地址是用无符号整型值来表示的,也就是unsigned int.因此一个指针类型变量的大小就是unsigned int类型的大小. - 64位系统,一个地址占用的二进制位数为64(8字节),32位系统,地址的二进制位数32(4字节).参考64位操作系统的指针不都是64位吗 32位cpu和64位cpu,这个位数指的是数据字长,而不是地址字长.两者没有必然的数值上的联系.处理器字长是指处

2015年阿里巴巴校招研发工程师在线笔试题汇总

在线笔试题汇总 卷一: 1.下面的函数中哪个是系统调用而不是库函数______? printf scanf fgetc read print_s scan_s 2.某足球队有四名外援,分别来自巴西.荷兰.意大利和美国.他们分别擅长前锋.后卫或守门,其中: ① 美国外援单独擅长守门: ② 意大利外援不擅长前锋: ③ 巴西外援和另外某个外援擅长相同的位置: ④ 荷兰外援擅长的位置和巴西外援不同. 以上条件可以推出巴西外援擅长的位置是______. 前锋 守门 后卫 前锋或守门 后卫或守门 前锋或后卫

转载 遇到过的一些php笔试题

遇到过的一些php笔试题 1.linux的多线程和多进程有什么区别?什么时候使用多线程,什么时候使用多进程? 答:(1)进程资源调度的最小单位,线程是cpu调度的最小单位:多进程开销大,多线程开销小,这是最基本的区别:一个进程里面可能有很多线程,把进程分解为线程之后就可以有效利用cpu和内存 (2)当需要频繁创建和销毁时优先选用多线程: 需要进行大量计算的优先使用线程: 强相关的处理用线程,弱相关的处理用进程:    可能要扩展到多机分布的用进程,多核分布的用线程: 都满足需求的情况下用最熟悉最

C/C++ 笔试题

/////转自http://blog.csdn.net/suxinpingtao51/article/details/8015147#userconsent# 微软亚洲技术中心的面试题!!! 1.进程和线程的差别. 线程是指进程内的一个执行单元,也是进程内的可调度实体.与进程的区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行(3)拥有资源:进程是拥有资源的独立单位,线程不拥有系统资源,但可以访问