#include <iostream>
using namespace std;
const int _max = 10001;
// c1是保存各项质量砝码可以组合的数目
// c2是中间量,保存没一次的情况
int c1[_max], c2[_max];
int main()
{
int nNum; //你想用已有的面值组成nNum大小的面值
int i, j, k;
//该代码的前提是假设所有面值为1、2、3、4、5.....的连续数,即下面的 i
//数量无限
while(cin >> nNum){
for(i=0; i<=nNum; ++i){//此时的nNum是第一个括号的所有项个数
c1[i] = 1;
c2[i] = 0;
}
for(i=2; i<=nNum; ++i){//nNum 括号个数
for(j=0; j<=nNum; ++j){//j是第一个括号里的每一项x^j的指数j
for(k=0; k+j<=nNum; k+=i){//k第二个括号的每一项x^k的指数
c2[j+k] += c1[j]; //目前的第一括号与第二括号两两相乘
} //由于第二括号的系数全为1,相乘后的系数就是c1[j],累加即可
}
for(j=0; j<=nNum; ++j){//把c2中的值给c1,并把c2清0
c1[j] = c2[j];
c2[j] = 0;
}
}
cout <<c1[nNum]<< endl;//输出能组成nNum大小的方案数
}
return 0;
}
母函数
最新推荐文章于 2020-11-12 19:39:32 发布