hdu1028:整数拆分

求整数的拆分数。。

一种解法是母函数

#include <iostream>

#include <stdio.h>

#include<string.h>

#include<algorithm>

#include<string>

#include<ctype.h>

using namespace std;

#define MAXN 10000

int dp[2][130];

int main()

{

    int n;

    while(scanf("%d",&n)!=EOF)

    {

        memset(dp,0,sizeof(dp));

        dp[0][0]=1;

        for(int i=1;i<=n;i++)

        {

            for(int j=0;j<=n;j++)

            {

                for(int k=0;j+k*i<=n;k++)

                {

                    dp[i%2][j+k*i]+=dp[(i-1)%2][j];

                }

                dp[(i-1)%2][j]=0;

            }

        }

        printf("%d\n",dp[n%2][n]);

    }

    return 0;

}
View Code


还有一种dp的方法

dp[n][m]表示 把n拆分成不大于 m的数的方案数

转移的时候按照拆分中的最大的数分类一下。。

dp[n][m]=sum {i=1~n}  ( dp[i][n-i] )----分类中最大数为  1~n

代码写成递归的记忆化搜索了

#include <stdio.h>

#include<string.h>

#include<algorithm>

#include<string>

#include<ctype.h>

using namespace std;

#define MAXN 10000

int dp[130][130];

int dfs(int n,int m)

{

    if(dp[n][m]!=-1)

        return dp[n][m];

    if(m==0)

        return dp[n][0]=0;

    if(n==0)

        return dp[0][m]=1;

    if(m>n)

        return dfs(n,n);

    return dp[n][m]=dfs(n,m-1)+dfs(n-m,m);

}

int main()

{

    memset(dp,-1,sizeof(dp));

    int t,x;

    while(scanf("%d",&x)!=EOF)

    {

        printf("%d\n",dfs(x,x));

    }





    return 0;

}
View Code

 

你可能感兴趣的:(HDU)