递推之整数划分问题(2)

原创 2013年12月03日 17:23:57

 

 整数划分问题的递推式dp( i , j )=dp(i-j,j)+dp(i,j-1);       

 
这里没有限制容器数量,所以与上一题的递推式{dp(i,j)=dp(i-1,j-1)+dp(i,j-i)}有所不同。

该递推式的含义由于理解的不同所以因人而已,网上主流的理解方法:
dp( i , j )代表一个数值i它可被划分为一个或多个小于等于j的数的方案数,它的递推式更容易理解,就是存在一个最大数j和不存在最大数j的方案数的总和。。

如 dp(10,2) ,则方案序列中有0~5个2可供选择,故有6种方案。

 

递推的具体实现代码如下:

public static int dp(int i,int j){
        if(i==0||j==1) return 1;
        if(i<j) return dp(i,i);
        else return dp(i-j,j)+dp(i,j-1);       
    }

回溯+剪枝的实现代码如下:

    public static void recur(int m, int t) {      //数m能被划分成最小数是t的序列
        if (m == 0) {

             count++;
        }
        for (int i = t; i <= m; i++) {
            recur(m - i, i);
        }
    }

 

 

 

采用递推的效率要比回溯法略高一些,因为在回溯法中可以按序的思想来采用剪枝的策略,但是效率还是比不上递推,但在回溯法中可以将过程的解存储起来,递推很难实现这一点,下面代码中为了方便采用了链表存储,两方法的效率还是有较大区别的,可以分别输入100进行测试。。

 

 

 


public class IntDiv {

    static ArrayList<Integer> a = new ArrayList();

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int p=scan.nextInt();
        recur(p, 1);
        System.out.println("------------------------");
        System.out.println(dp(p,p));
       
    }

    public static void recur(int m, int t) {      //数m能被划分成最小数是t的序列
        if (m == 0) {
            for (int i = 0; i < a.size(); i++) {
                System.out.print(a.get(i) + " ");
            }
            System.out.println();

             return;
        }
        for (int i = t; i <= m; i++) {
            a.add(i);
            recur(m - i, i);
            a.remove(a.size() - 1);
        }
    }
   
    public static int dp(int i,int j){
        if(i==0||j==1) return 1;
        if(i<j) return dp(i,i);
        else return dp(i-j,j)+dp(i,j-1);       
    }
}

相关文章推荐

整数划分问题(递归&递推)

1:问题描述: 整数划分问题是将正整数n表示成一系列正整数之和:n=n1+n2+n3+...+nk,其中n1>=n2>=n3>=...nk>=1,这种表示方法称为整数划分。求正整数n的不同划分个数。 ...

整数划分相关递推

前面讨论的“石子合并”问题也属于划分问题,同时前面还讨论了“前10个阶乘所能构成和为n的方法数”这样的问题,已经基本属于整数划分的问题了,本小节,根据碰到的一些整数划分问题给出算法分析与解决。 一....

UESTC 2016 Summer Training #2 Div.2 A dp、递推、多阶段问题

训练的时候刚开始想到的是记忆化搜索, 但无论怎么优化还是TLE 3,没办法,想想递推怎么写 但是转化方程还是有点小问题, WA5 然后后来才想明白 只要 dp[i][j] = max(dp[i+1][...

HDOJ 1223 java大整数递推

又有月赛了  虽然已经是大四实习的老人了 但是还是没忍住做了一题。。 翻了一道没人A的题看了下~ 大致题意是有N个数,请问有多少种大小关系 比如3个数就是: 1) A=B=C 2) A=B ...

背包问题的递推解决

  • 2013年11月05日 09:13
  • 3KB
  • 下载

核电站问题「he」题解递推

  • 2017年07月29日 09:55
  • 40KB
  • 下载

动态规划-整数划分问题(2)

整数划分 --- 一个老生长谈的问题:   1) 练练组合数学能力.   2) 练练递归思想   3) 练练DP   总之是一道经典的不能再经典的题目:   这道好题求:   1. 将n划分成若干正整...

Hdu 4695 线性递推模版(m^2logn)

#include #pragma comment(linker, "/STACK:102400000,102400000") using namespace std; typedef long lo...

【noip2011年提高组T2】 选择客栈 思路+灵感+递推

P1311 选择客栈题目描述丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号。每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖...

[CodeForces] Round #313 Div 2 E / Div 1 C Gerald and Giant Chess 不用容斥的递推组合数学

E. Gerald and Giant Chess time limit per test 2 seconds memory limit per test 256 megabytes input s...
  • fcxxzux
  • fcxxzux
  • 2015年07月24日 14:52
  • 1091
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:递推之整数划分问题(2)
举报原因:
原因补充:

(最多只允许输入30个字)