母函数

#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;  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值