zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",dfs(x,x));
        }
    
    
        return 0;
    }
    View Code
  • 相关阅读:
    产生半透明效果的步骤
    突发奇想
    特征提取
    matlab计算混淆矩阵
    feature selection
    PCA in OriginPro 8.6
    计算局部方差
    最下生成树原理
    点击图像获取RGB
    区域填充算法
  • 原文地址:https://www.cnblogs.com/oneshot/p/4082026.html
Copyright © 2011-2022 走看看