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

本文介绍了一种使用母函数(生成函数)解决货币组合问题的方法。通过定义多项式及其系数来表示不同面额的货币,利用多项式相乘实现组合计数。最终计算出1元、2元等面额组成100元的所有可能组合。

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 }

-

 

转载于:https://www.cnblogs.com/nipan/p/4089789.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值