整数划分

题目:将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,
其中n1≥n2≥…≥nk≥1,k≥1。
正整数n的这种表示称为正整数n的划分。求正整数n的不
同划分个数。
例如正整数6有如下11种不同的划分:
6;
5+1;
4+2,4+1+1;
3+3,3+2+1,3+1+1+1;
2+2+2,2+2+1+1,2+1+1+1+1;
1+1+1+1+1+1。
思路:采用递归,将正整数n进行划分,最大的加数不能大于划分数m。分析:
1.当n = 1或m = 1,一种划分方法
2.当n == m ,划分方法分成包含m和不包含m两种,即=1+func(n,n-1)
3.当n > m时,划分方法分为包含m和不包含m,即func(n-m,m)+func(n,m-1)
(1)包含m:可以看出 m+(…….),而(……)的划分方法就是func(n-m,m)
(2)不包含m:可以看成n的m-1划分,即func(n,m-1)
3.当n < m,划分是正整数之和,不可能出现负数,即=func(n,n)

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        int t=input.nextInt();
        while (t>0) {
            int n=input.nextInt();
            System.out.println(function(n, n));
            t--;
        }
        // TODO Auto-generated method stub

    }
    public static int function(int n,int m){
        if (n==1 || m==1) {
            return 1;
        }else if (n<m) {
            return function(n, n);
        }else if (n==m) {
            return function(n, n-1)+1;
        }else {
            return function(n, m-1)+function(n-m, m);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值