zoukankan      html  css  js  c++  java
  • 母函数法解决整数划分

    问题描写叙述:把一个整数n划分成1到n的划分,比如3能够划分为1+1+1,1+2,3这三种划分。那么求n的划分数。


    解题思路:

        能够把1,设为x的0次方:x^0

        把1,设为x的1次方:x^1

        .......把n。设为是x的n次方:x^n

        那么1可能出现。0,1,2,3,4,5,6...n次,而2可能出现0,1,2,3,.......n/2次,3可能出现0,1,2,3,4........n/3次等等。

       按照上面的把1能够表示成x^1:那么可能出现的次数就是1+x^1+2*x^1+3*x^1+...n*x^1,同理有1+1*x^2+2*x^2+.....(n/2)*x^2那么把这些多项式相乘起来,得

    (1+1*x^1+2*x^1....n*x^1)(1+x^2+2*x^2....(n/2)*x^2).....(x^n)是不是x^n终于的系数就是n的整数划分数,以下是我的代码:

    public class Main {
    
    	public static int getNum(int n){
    		//存放终于的结果
    		int[] c1=new int[n+1];
    		//存放当前两个多项式相乘的结果
    		int[] c2=new int[n+1];
    		//初始化让c1開始的系数全为1
    		Arrays.fill(c1, 1);
    		//初始化让c2開始的系数全为0
    		Arrays.fill(c2, 0);
    		for(int i=2;i<=n;i++){
    		//i代表当前的x究竟是多少次方
    			for(int j=0;j<n+1;j++){
    				//j代表从c1取出每一个系数准备与当前多项式相乘
    				for(int k=0;k+j<=n;k+=i){
    					//k代表从当前x次方的多项式取出每一项然后,与c1里的多项式相乘
    					c2[j+k]+=c1[j];
    				}
    			}
    			//将c2存储的缓存结果放入c1
    			for(int z=0;z<n+1;z++){
    				c1[z]=c2[z];
    				c2[z]=0;
    			}
    		}
    		return c1[n];
    	}
    	public static void main(String[] args) {
    		System.out.println(getNum(100));
    
    	}
    
    }
    


  • 相关阅读:
    NetCore使用Log4Net记录日志
    WCF数据协议中XmlArrayItem标签不起作用的问题
    WTM Blazor,Blazor开发利器
    WTM5.0发布,全面支持.net5
    log4netdemo
    mes 入库单号 锁表方案
    线程基础篇-线程同步
    线程基础篇-线程和进程
    EF基础篇-Code First
    EF基础篇-DB First
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7191868.html
Copyright © 2011-2022 走看看