一个货币组合的问题(二)——母函数解法

10月23号的时候,写了用递归和动态规划的方式解决货币组合的方法(见《一个货币组合的问题》)

这两天看到《组合数学》中,使用母函数(生成函数)解决排列组合问题的方法,觉得可以用在货币组合问题上。试验了一下,果然可以。

(这里空出,详细地写一下母函数的方法,加深自己的理解。)

代码如下:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
 4 #define MAXITEMS 128
 5
 6 int v[6] = {1, 2, 5, 10, 20, 50};
 7 int c1[MAXITEMS]; // 被乘的多项式的系数
 8 int c2[MAXITEMS]; // 作为乘数的多项式的系数
 9 int result[MAXITEMS]; // 存放结果
10 // 两个多项式相乘
11 void
12 MultiplePoly(int c1[], int max1, int c2[], int max2)
13 {
14     int i, j;
15     for (i = 0; i <= max1; i++) {
16         for (j = 0; j <= max2; j++) {
17             result[i + j] += c1[i] * c2[j];
18         }
19     }
20 }
21
22 int
23 main(int argc, char** argv)
24 {
25     int i, j;
26     // 初始化1元
27     memset(c1, 0, sizeof(int) * MAXITEMS);
28     for (i = 0; i <= 100; i++) {
29         c1[i] = 1;
30     }
31     // 初始化2到50元,并作乘法
32     for (i = 1; i < 6; i++) {
33         memset(c2, 0, sizeof(int) * MAXITEMS);
34         for (j = 0; j <= 100; j += v[i]) {
35             c2[j] = 1;
36         }
37         memset(result, 0, sizeof(int) * MAXITEMS);
38         MultiplePoly(c1, 100, c2, 100);
39         memmove(c1, result, sizeof(int) * MAXITEMS);
40     }
41
42     printf("1元、2元、5元、10元、20元、50元组成100元的方法一共有%d种。\n ", result[100]);
43
44     system("pause");
45     return 0;
46 }

-

时间: 2024-08-29 00:49:33

一个货币组合的问题(二)——母函数解法的相关文章

一个货币组合的问题

今年五月份的时候,宿舍的人找实习,笔试碰到一道货币组合的问题,是这样子的: 现在我们有1元.2元.5元.10元.20元和50元,每种面值都有若干张.请问,如果要用这些货币组成100元的话,有多少种方法? 他们笔试回来,就讲了这个问题.当时本菜就写了个暴力的方法(反正计算机有这么大的算力……) 1 #include <cstdio> 2 #include <cstdlib> 3 4 int 5 main(int argc, char** argv) 6 { 7 int count =

剑指offer-特定二维数组中查找一个元素是否存在-二分搜索-二维数组

int [][] array ={ {1,2,8,9}, {2,4,9,12}, {4,7,10,13}, {6,8,11,19} }; 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. public class Solution { public static boolean Find(int target, int [][] array) { int M = array.le

递归求解几类排列组合问题(二、全组合排列)

对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. Sample Input 3 1 2 3 Sample Output 123 132 213 231 312 321 #include<stdio.h> #include<strin

Android 上的 制表符(tab) —— 一个神奇的字符 (二)

接到上回的说,主要是上回那个问题,我觉得是android的bug,黎叔觉得是cocos2dx的bug,叫我去提交bug.所以我又继续研究了下. 上回说到会调用java层的函数去创建一个image,然后作为纹理设置给精灵,在那个地方crash了,此处代码如下: public static void createTextBitmapShadowStroke(String pString, final String pFontName, final int pFontSize, final float

webmagic的是一个无须配置、便于二次开发的爬虫框架

webmagic的是一个无须配置.便于二次开发的爬虫框架,它提供简单灵活的API,只需少量代码即可实现一个爬虫. 以下是爬取oschina博客的一段代码: ? 1 2 Spider.create(new SimplePageProcessor("http://my.oschina.net/", "http://my.oschina.net/*/blog/*")).thread(5).run(); webmagic采用完全模块化的设计,功能覆盖整个爬虫的生命周期(链接

guozhongCrawler的是一个无须配置、便于二次开发

guozhongCrawler的是一个无须配置.便于二次开发的爬虫开源框架,它提供简单灵活的API,只需少量代码即可实现一个爬虫.模块化设计完全 面向业务提供接口,功能覆盖整个爬虫的生命周期(链接提取.页面下载.内容抽取.持久化),支持多线程抓取,分布式抓取,并支持自动重试,定制执行js. 自定义cookie等功能.在处理网站抓取多次后被封IP的问题上,guozhongCrawler采用动态轮换IP机制有效防止IP被封.另外,源码中 的注释及Log输出全部采用通俗易懂的中文.让初学者能有更加深刻

【编程题目】求一个矩阵中最大的二维矩阵(元素和最大)

35.(矩阵)求一个矩阵中最大的二维矩阵(元素和最大).如:1 2 0 3 42 3 4 5 11 1 5 3 0中最大的是:4 55 3要求:(1)写出算法;(2)分析时间复杂度;(3)用 C 写出关键代码 早上灭小题! /* 35.(矩阵) 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 0 3 4 2 3 4 5 1 1 1 5 3 0 中最大的是: 4 5 5 3 要求:(1)写出算法;(2)分析时间复杂度;(3)用 C 写出关键代码 */ #include <stdio.h>

IT公司100题-35- 求一个矩阵中最大的二维矩阵(元素和最大)

问题描述: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 中最大的是: 4 5 9 10 分析: 2*2子数组的最大和.遍历求和,时间复杂度为O(mn). 代码实现: 1 // 35.cc 2 #include <iostream> 3 #include <climits> 4 using namespace std; 5 6 int find_max(int (*a)[5], int m, int n) { 7 in

Myeclipse/STS 首次在本地部署配置一个Spring MVC 项目 (十二)

1. 在本地新创建一个文件夹 ,做为项目工作空间; 2. 用 Myeclipse 或 STS 进入该文件夹,该文件夹就成为项目的工作空间: 3. 就要进 窗口-首选项,配置: 环境默认编码: 1>. 常规下面 内容类型 .txt 文本 UTF-8 更新 2>. 常规 – 工作空间 , 文本文件编码 3>. 常规 – 编辑器 – 文本编辑器 – 拼写 配置 java JDK 为 项目需要的版本 比如 (1.7) : 配置 Myeclipse 下的 Servers 及 validation