根据博客补充理解,小白一只
https://blog.csdn.net/howardemily/article/details/75041523
思想
1.“把组合问题的加法法则和幂级数的乘幂对应起来”
2.“母函数的思想很简单 —就是把离散数列和幂级数一一对应起来,把离散数列间的相互结合关系对应成为幂级数间的运算关系,最后由幂级数形式来确定离散数列的构造. “
#include<cstdio>
#include<cstring>
using namespace std;
// 每一个括号括起来的就是一个表达式
// sup是保存多项式的数组,sup[n]中的值代表x^n的系数
// temp是临时多项式,保存相乘的临时中间情况
int sup[1000], temp[1000];
/*
程序始终只计算两个多项式之间的乘积,多个多项式的情况
先计算前两个的乘积,将结果作为第一个多项式,再与第三个相乘
依次类推,sup始终存放当前运算后的结果然后作为被乘多项式,
*/
int main()
{
int n; // 目标 相当于x^n(指数)
int i, j, k;
printf("输入指数:");
while(scanf("%d",&n)!=EOF)
{
for(i=0; i<=n; ++i)
{
sup[i] = 1;
//初始化第一个多项式,也就是用1g砝码的多项式,
//注意如果题目没给1g的砝码那么就不能++i,而要加上砝码的质量
temp[i] = 0;
//将临时区清空,无论第一个多项式质量是几都要全部置零
}
for(i=2; i<=n; ++i)
// 生成后续的第i个表达式,此题中是2g,i从2开始。(第i个表达式)(1+x+x^2+..x^n)
//如果砝码的值不是规律增长,i可能需要取决于输入
{
for(j=0; j<=n; ++j)
// 遍历当前结果表达式的每一项(当前表达式的第j项)与第i个表达式相乘,
//j从0到n遍历,这里j就是(前面几个表达式累乘的表达式)里第j个变量,
//如(1+x)(1+x^2)(1+x^3),j先指示的是1和x的系数,i=2执行完之后变为(1+x+x^2+x^3)(1+x^3),
//这时候j应该指示的是合并后的第一个括号的四个变量的系数。
for(k=0; k+j<=n; k+=i)
//第i个表达式的呈现
// k表示的是第j个指数,所以k每次增i(因为第i个表达式的增量是i)。
{
temp[j+k] += sup[j];
//幂运算
}
for(j=0; j<=n; ++j)
// 将临时的结果覆盖当前结果,同时把临时结果置零,为下次做准备
{
sup[j] = temp[j];
temp[j] = 0;
}
}
printf("输出方案结果:");
printf("%d\n",sup[n]); //输出结果
}
return 0;
}
HDU基础题目
(相应题目解析均在相应的代码里分析)
1. 模板题目:http://acm.hdu.edu.cn/showproblem.php?pid=1028
代码:http://www.wutianqi.com/?p=587