整数划分

整数划分问题是算法中的一个经典命题之一。把一个正整数n表示成一系列正整数之和:
n = n1 + n2 + ~ + nk 其中,n1>=n2>=~>=nk>=1 ,k>=1

正整数n的这种表示称为正整数n的划分。正整数n的不同划分个数称为正整数n的划分数,记作 P(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

分析:

  1. 当n=1时,无论m为什么值,只有一种划分。F(1,m) = 1, m>=1.
  2. 当m=1时,无论n的值为什么,只有一种划分。F(n,1) = 1, n>=1。
  3. 当m>=n时,最大加数实际上不能超过n。F(n,m)=F(n,n)。
  4. 当n=m时,F(n,n) = 1 + F(n,n-1)。
  5. 当n>m时,F(n,m) = F(n,m-1) + F(n-m,m)。

代码

#include <iostream>

using namespace std;

int f(int n,int k)
{
    if(n==1||k==1)
        return 1;
    if(n<=k)
        return 1+f(n,n-1);
    if(n>k)
        return f(n,k-1)+f(n-k,k);
    return 0;
}
int main()
{
    int n;
    cin>>n;
    cout<<f(n,n)<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值