码迷,mamicode.com
首页 > 其他好文 > 详细

hdu1028:整数拆分

时间:2014-11-07 20:44:38      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   ar   os   sp   for   

求整数的拆分数。。

一种解法是母函数

bubuko.com,布布扣
#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

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

bubuko.com,布布扣
#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

 

hdu1028:整数拆分

标签:style   blog   http   io   color   ar   os   sp   for   

原文地址:http://www.cnblogs.com/oneshot/p/4082026.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!