zoukankan      html  css  js  c++  java
  • 整数拆分问题(和与积) void

    给定一个整数n,要找出n能拆分成多少种不同的若干个数的和与乘积的形式。比如:
        4=4                   12=1*12
        4=1+3               12=2*6
        4=2+2               12=3*4
        4=1+1+2           12=2*2*3
        4=1+1+1+1
        先看加法形式,可以构造一个母函数F(x)=(1+x+x^2+...+x^n)(1+x^2+x^4+...+x^n)...(1+x^n),将这个母函数展开后,求出每一个x^k前面的系数Ck,就是对应的整数K有多少种拆分的形式。

    #include <iostream>
     using namespace std;
      
      const int MAXN = 120;
      int c1[MAXN+1],c2[MAXN+1];
      
      int main(){
          int i,j,k,n;
          for(i=0;i<=MAXN;i++)
             c1[i]=1,c2[i]=0;
         for(i=2;i<=MAXN;i++){
             for(j=0;j<=MAXN;j++)
                 for(k=0;k+j<=MAXN;k+=i)
                     c2[j+k]+=c1[j];
             for(j=0;j<=MAXN;j++)
                 c1[j]=c2[j],c2[j]=0;
         }
         while(cin>>n) cout<<c1[n]<<endl;
         return 0;
     }
    

    对于乘积的形式,设n=i*j,dp[n]为整数n拆分成乘积形式的个数,dp[n]=∑dp[i]=∑dp[j] (i∈{i : i*j=n},j∈{j : i*j=n}),这就是这个问题的状态转移方程,具有动态规划问题的最有子结构性质。

    //乘积拆分 
     #include <iostream>
     using namespace std;
     const int MAXN = 200000;
     int dp[MAXN+1]; 
     int main(){
     int i,j,n;
     for(dp[1]=1,i=2;i<=MAXN;i++)
     for(j=1;i*j<=MAXN;j++)
     dp[i*j]+=dp[j];
     while(cin>>n) cout<<dp[n]<<endl;
     return 0;
     }
    
  • 相关阅读:
    boost库常用库介绍
    boost介绍
    vs2019+win10配置boost库
    交互式多媒体图书平台的设计与实现
    47.全排列 2
    46.全排列
    基于VSCode的C++编程语言的构建调试环境搭建指南
    码农的自我修养之必备技能 学习笔记
    工程化编程实战callback接口学习笔记
    Erlang模块inet翻译
  • 原文地址:https://www.cnblogs.com/void/p/2065294.html
Copyright © 2011-2022 走看看