• 求用1g、2g、3g的砝码(每种砝码有无穷多个)称出10g的方案有几种


    #include <iostream>    
    using namespace std;       
    //     
    const int maxx = 1000;     
    // sup是保存多项式的数组,sup[n]中的值代表指数为i的系数 ,下标i是x的指数 
    // temp是临时多项式,保存相乘的临时中间情况 (合并相同指数的多项式)   
    int sup[maxx], temp[maxx];     
    /* 
    程序始终只计算两个多项式之间的乘积,多个多项式的情况 
    先计算前两个的乘积,将结果作为第一个多项式,再与第三个相乘 
    依次类推,sup始终存放当前运算后的结果然后作为被乘多项式, 
    */  
    
    
    
    int main()    
    {     
        int target;   //  目标重量, 比如上面的例子里就是10,要<max的值  
        int i, j, k;    
         
        while(cin >> target)    
        {    
            for(i=0; i<=target; ++i)       
            {    //初始化第一个多项式,也就是用1g砝码的多项式, 注意如果题目没给1g的砝码那么就不能++i,而要加上砝码的质量  
                sup[i] = 1;     
                temp[i] = 0;    //将临时区清空,无论第一个多项式质量是几都要全部置零  
            }   
    
            for(i=2; i<=target; ++i)    //后面有n-1个表达式(括号里的式子),要展开n-1次,i指第i个表达式 
    // 生成后续的第i个多项式,此题中是2g,i从2开始。  
    //如果砝码的值不是规律增长,i可能需要取决于输入  
            {    
                for(j=0; j<=target; ++j)//将(1+x^i)*(1+x^j)相乘展开,整理合并项       
                  {
                      for(k=0; k+j<=target; k=k+i)  //只用保留指数<=n的项,所以k+j<=n  
                      {    
                        temp[j+k]=temp[j+k]+ sup[j]; //j指当前表达式里项的第j个项,k指后一个表达式里项的指数,k=k+i
                      }   
                  }   
                for(j=0; j<=target; ++j)   // 将临时的结果覆盖当前结果,同时把临时结果置零,为下次做准备     
                {    
                    sup[j] = temp[j];    
                    temp[j] = 0;    
                }    
            }    
            cout << sup[target] << endl;  //输出结果  
        }    
        return 0;    
    }

     https://blog.csdn.net/bjrxyz/article/details/8123821

  • 相关阅读:
    释放 Linux 系统预留的硬盘空间(转)
    内存置换空间(swap)之建置(转)
    启动挂载(转)
    硬链接与软链接(转)
    磁盘与目录的容量(转)
    linux网络相关配置文件(转)
    python资源库大全
    pikachu学习记录(二)
    pikachu学习记录(一)
    sqlmap基础用法
  • 原文地址:https://www.cnblogs.com/-citywall123/p/9911583.html
Copyright © 2020-2023  润新知