整数划分

本文提供了两种不同的算法实现来解决整数划分的问题,即求解一个整数可以由多少种方式分解为较小正整数之和。第一种算法采用二维动态规划的方式进行优化,第二种则通过递归方式解决该问题。

把一个整数划分为比他小的正整数之和共有多少种方法:
代码1:
#include<stdio.h>
int main(void)
{
    int m,n;
    unsigned long long a[505][505];
    int i;
    for(i=0;i<=500;++i)
    {
        a[i][0]=0;
        a[0][i]=1;//初始化。
    }
    for(n=1;n<=500;++n)
    {
        for(m=1;m<=n;++m)
        {      
            if((n-m)<m) a[n-m][m]=a[n-m][n-m];
            a[n][m]=a[n-m][m]+a[n][m-1];//分为用m和不用m。
        }
       
    }
    scanf("%d",&n);
    while(n)
    {
        printf("%llu\n",a[n][n]);
        scanf("%d",&n);
    }
    return 0;
}

代码2:
#include<stdio.h>
int q(int n,int m)
{
 if((n<1)||(m<1)) return 0;
 if((n==1)||(m==1)) return 1;
 if(n<m) return q(n,n);
 if(n==m) return q(n,m-1)+1;
 return q(n,m-1)+q(n-m,m);
}

int main(void)
{
 int n,m;
 int result;
 while(scanf("%d",&n)==1&&n!=0)
 {
  m=n;
  result=q(n,m);
  printf("%d\n",result);
 }
 return 0;
}
其中1比2更优化。

转载于:https://www.cnblogs.com/heiyewuhen/archive/2009/08/29/1556467.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值