题意:

  输入一个数n,求组合成此数字可以有多少种方法,每一方法是不记录排列顺序的。用来组成的数字可以有1、2、3....n。比如n个1组成了n,一个n也组成n。这就算两种。1=1,2=1+1=2,3=3=1+2=1+1+1,而1+2和2+1只能算一种。n最大为120。

思路:关于母函数的原理不讲了。讲怎么实现几个括号相乘。

思路:

我们要算的n是等于120,把其简化为5,就是说设n最大为5,道理一样的。5一共有7种方法对吗!自己手写吧。

如果想要得出结果,那么一共有5个括号要相乘,分别如下:

为什么是5个括号?

第1个括号:最多可由5个1组成。

第2个括号:最多只能有两个2对吧?如果3个2就已经是6了,6超过5了喔~

第3~5个括号:好了,你已经学会了类推法!

怎么乘?

以初中老师教的方法是第2个括号乘以第1个括号,然后第3个括号乘以上一次相乘的结果....

一共4步,也就是n-1步,那么i=2to n是不是有n-1步?比如i=2、3、4、5,就是4步嘛。

接着,两个括号的相乘要怎么办?

在i的循环内再加一个循环,得把每一步的右边括号里的每个数都要乘以左边括号一次。那j的上下限是多少?下限为0,上限是5,即n。但是过程不是只是自增一,而是自增i个单位,为什么?第1步j的值就会为0、2、4,间隔为2,而第2步中j的值就会为0、3,间隔为3,如果n>5的话,第2步的j的值就会为0、3、6了。所以呢!j=0 to n递增方式(j+=i)。

此时就完毕了?没呢!

上一步骤只是将每一步中的右边括号拆出来逐个乘以左边括号,但是左边括号还没拆呢。对于每个j,也就是右边括号里的每个值,都得逐个乘以左边括号里的每个值。那么得再叠加一层循环了,下限为0,上限为5,即为n。又为什么?第1个括号中不是有6位吗,而每个括号中还有个1在最前面,别落下了。这里讲不出思路了,意会吧!

讲代码:

代码中ans数组先保存第1个括号中的每个系数,也就是全为1,比如ans[0]=1,ans[1]=1.....

这个数组在同一个i值的情况下不能变化,我本来想用一个数组解决,但是后来发现搞不定,所以开了个辅助数组sup。

当每次右括号中的一个数乘以左括号时,将相乘的结果累加在sup数组中,整个右括号里的数都乘过一次后,再将sup数组中的值存到ans数组中, 作为临时答案。

这样子ans中最后保存的就是所要的系数了,ans的下标代表x的几次方,比如ans[4]代表x的4次方的系数。

将整个乘法的过程自己实现一下才知道其精髓,和很多需要注意的地方,看代码实在不是好习惯。

本题可用递推、DP等方法来做,但是此题是母函数的入门经典喔~所以我用了母函数

 #include <iostream>
#define N 120
using namespace std;
int ans[N+],sup[N+];//ans保存答案,sup保存临时值
void main()
{
int num=,i,j,k;
for(i=;i<N+;i++) //全部初始化为1
ans[i]=;
for(i=;i<=N;i++) // 第i个括号
{
for(j=;j<=N;j+=i) //第i个括号中的第j项
for(k=;k+j<=N;k++) //临时答案中的第k个数字
sup[j+k]+=ans[k];
for(k=;k<=N;k++) //每解决一个括号,得将答案保存,后一括号乘以此答案得出新答案
ans[k]=sup[k];
memset(sup,,sizeof(sup));//临时数组清零
}
while(cin>>k) //用c++的话得这么写才对
cout<<ans[k]<<endl;
}

1028

HDU 1028 Ignatius and the Princess III伊格和公主III(AC代码)母函数的更多相关文章

  1. hdu 1028 Ignatius and the Princess III 简单dp

    题目链接:hdu 1028 Ignatius and the Princess III 题意:对于给定的n,问有多少种组成方式 思路:dp[i][j],i表示要求的数,j表示组成i的最大值,最后答案是 ...

  2. ACM: HDU 1028 Ignatius and the Princess III-DP

     HDU 1028 Ignatius and the Princess III Time Limit:1000MS     Memory Limit:32768KB     64bit IO Form ...

  3. HDU 1028 Ignatius and the Princess III 整数的划分问题(打表或者记忆化搜索)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1028 Ignatius and the Princess III Time Limit: 2000/1 ...

  4. hdu 1028 Ignatius and the Princess III(DP)

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  5. HDU 1028 Ignatius and the Princess III (母函数或者dp,找规律,)

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  6. hdu 1028 Ignatius and the Princess III 母函数

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  7. hdu 1028 Ignatius and the Princess III (n的划分)

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  8. HDU 1028 Ignatius and the Princess III (递归,dp)

    以下引用部分全都来自:http://blog.csdn.net/ice_crazy/article/details/7478802  Ice—Crazy的专栏 分析: HDU 1028 摘: 本题的意 ...

  9. HDU 1028 Ignatius and the Princess III (生成函数/母函数)

    题目链接:HDU 1028 Problem Description "Well, it seems the first problem is too easy. I will let you ...

  10. HDU 1028 Ignatius and the Princess III (动态规划)

    题目链接:HDU 1028 Problem Description "Well, it seems the first problem is too easy. I will let you ...

随机推荐

  1. Java数组转置

    数组转置,就是将打印的数组的列和行进行位置对换. 我们就可以用两个for循环遍历数组,然后交换arr[i][j]与arr[j][i] public class Demo{ public static ...

  2. 20169219《linux内核原理与分析》第七周作业

    网易云课堂学习 把write系统调用加入到MenuOS里面 我在试验过程中在MenuOS里加入了time.time-asm.write和write-asm命令.以time和time-asm为例, 步骤 ...

  3. 【linux-./configure 配置文件时出错问题】

    环境是:centos 5.6 安装系统时,可能安装的是标准的精简版本,所以没有选择软件依赖包,很多软件都没有安装. 现在需要安装软件,安装软件时报错: make: *** 没有指明目标并且找不到 ma ...

  4. PS2018学习笔记(19-24节)

    19-随心所欲变换 # 本节知识点 自由变换 移动变换 旋转变换 斜切变换 变形变换 扭曲变换 透视变换 # 本节段落表 自由变换命令 变换中的移动 再次变换命令 对象缩放 旋转 斜切 变形 扭曲 透 ...

  5. Cogs 465. 挤牛奶

    465. 挤牛奶 ★   输入文件:milk2.in   输出文件:milk2.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 三个农民每天清晨5点起床,然后去牛棚给3 ...

  6. dbms_xplan的display查看执行计划

    DBMS_XPLAN包包括一系列函数,主要是用于显示SQL语句的执行计划,且不同的情形下使用不同的函数来显示,如预估的执行计划则使用 display函数,而实际的执行计划则是用display_curs ...

  7. 微信小程序-修改单选框和复选框大小的方法

    方法有两种: 一:采用css的zoom属性 zoom缩放会将元素保持在左上角,并且会有毛边,可能会稍稍改变元素原来的形状. 二:采用css3的transform:scale属性 zoom缩放会将元素保 ...

  8. ACM-较大的数乘法取模技巧*

    比如模数是1e15这种,相乘的时候爆LL了,但是又不想用大数,咋办呢? long long ksc(long long a, long long b, long long mod){ ; while( ...

  9. CF C. Plasticine zebra (思维)

    题意: 是输入一个只有'w','b'的字符串,可以对他的任意位置切割成两个子串,切割后的右边的子串翻转后再和左边的子串拼起来会得到一个新的字符串,操作次数不限,问能得到的字符串中wb交替出现的最大的长 ...

  10. idea中导入githup项目

    转载大神: https://blog.csdn.net/m0_37630602/article/details/69950528