动态规划问题详解(二)

原创 2013年12月03日 16:45:01

  在动态规则问题详解(一)中,我们用1,3,5三个硬币,求用最少的硬币组成11元的问题。这一节,我们来讨论一个复杂一点的问题。这个问题,曾经是某公司的面试题。

   有从1-N个连接的整数,把1-N个整个划分为二个相等的集合,问有几种划分的方法。

       如  {1,2,3},则有{1,2}和{3},只有一种划分方法。

       如{1,2,3,4,5,6,7} 则有

 {1,6,7} and {2,3,4,5} {注 1+6+7=2+3+4+5}
{2,5,7} and {1,3,4,6}
{3,4,7} and {1,2,5,6}
{1,2,4,7} and {3,5,6}

这四种组合,编写程序,输入N,输入有几种划分的组合数。
如输入3,则输出1
输入7,则输出4
这个问题如何求解呢?
我们先分析,1-N个整数,和是多少? 根据等差数列的公式,我们得到 s=n*(1+n)/2,题目中要求把1-N划分为两个相等的集合,那么,s必须是偶数。 s%2 =0 . 如果s为奇数,则直接返回0.如果s为偶数,则,问题转化为,从1-N中取前i个数,使它们的和为s/2的组合。我们设d[i][j]为集合组和的个数,其中j为前i个数的和。那么,d[i][j]的状态方程如何写呢?
  d[i][j]为前i个数的和,按照动态规划的思想,d[i][j]的状态,只和i-1个数的状态有关。第i个数,要么在集合中,要么不在集合中(有人要问了,不是所有的数都要在集合中么?是的,共有两个集合,我们只拿其中一个集合来思考)
如果第i个数,在集合中,则第i-1个数的和为j.  d[i][j]=d[i-1][j].如果第i个数在集合中,则前i-1个数的和,为j-i.  d[i][j]=d[i-1][j-i]。
现在d[i][j]有两种情况,我们如何处理呢?之前我说过,本来共有2个集合,但为了思考的方便,我们只考虑了一个集合的情况.第i个数,要么在第一个集合中,要么在第二个集合中。
如{1,2,3} 可以划分成{1,2}及{3} 也可以划分为{3}及{1,2},虽然在本题中,这两种情况只算一种。但这个对我们后面结果数除以2的理解是有帮助的。
我们把这两种情况相加,然后除以2。
d[i][j]=d[i-1][j]+d[i-1][j-i]
有了这个状态转移方程,我们就可以很方便的写出代码了。


#include <stdio.h>
void main()
{
  int N=3;
  int way = divide(N);
  printf("%d\n", way);
}

int divide(int N)
{
  int d[1024]={0};
  int total=N*(N+1)/4;
  if (total*2 % 2)
  {
    return 0;
  }
  int i;
  int j;
  d[0]=1;
  for (i=1;i<=N;i++)
  {
    for (j=total;j>=i;j--)
    {
      d[j]= d[j] + d[j-i];
    }
  }
  return d[total]/2;
}



《TCP/IP详解卷2:实现》笔记--TCP的输入

当收到的数据报的协议字段指明这是一个TCP报文段时,ipintr(通过协议协议转换表中的pr_input函数)会调用tcp_input 进行处理,tcp_inut在软件中断一级执行。 函数非常长,我们...
  • TODD911
  • TODD911
  • 2015年01月06日 22:45
  • 1695

模式识别(二):分类问题简介

根据上一节的知识,不难看出,模式识别的核心任务是——分类。 这一节我们通过一个识别动物种类的简单例子,说明一下分类的基本类别和方法。 一般地,分类问题可以分为两类和多类两种,如下图所示: 有人可能...
  • longyindiyi
  • longyindiyi
  • 2014年02月28日 10:27
  • 5299

数值优化(Numerical Optimization)学习系列-最小二乘问题(Least-Squares)

概述 最小二乘问题在实际应用中非常广泛,也是无约束最优化问题的重要应用之一,但是对于该问题还有一些特殊的求解思路,供参考。该小结主要介绍: 问题定义 线性最小二乘问题以及求解 ...
  • fangqingan_java
  • fangqingan_java
  • 2015年12月27日 18:52
  • 1901

回归--线性最小二乘问题

线性最小二乘的求解
  • wxcdzhangping
  • wxcdzhangping
  • 2014年04月11日 17:12
  • 2016

二分类问题特征选择的常用两个方法

二分类问题特征选择的常用两个方法                  2014-6-25   (1)互信息。值越大,相关性越强   w是特征,t是目标。反应的是特征出现和不出现对目标值的影响。...
  • hero_fantao
  • hero_fantao
  • 2014年06月25日 22:04
  • 2920

利用Levenberg_Marquardt算法求解无约束的非线性最小二乘问题~

早就想写这篇文章,但是一直没抽出空,主要是画图比较麻烦,嘿嘿~ 现在介绍如何利用经典的Levenberg_Marquardt算法求解无约束的非线性最小二乘问题。Levenberg_Marquardt算...
  • wsj998689aa
  • wsj998689aa
  • 2014年11月05日 17:19
  • 3530

LM算法与非线性最小二乘问题

摘录的一篇有关求解非线性最小二乘问题的算法--LM算法的文章,当中也加入了一些我个人在求解高精度最小二乘问题时候的一些感触: LM算法,全称为Levenberg-Marquard算法,它可用于解决非...
  • zbc1090549839
  • zbc1090549839
  • 2015年09月20日 11:23
  • 5477

《TCP/IP详解卷2:实现》笔记--插口层

插口层的主要功能是将进程发送的与协议有关的请求映射到产生插口时指定的与协议有关的实现。下图说明了进程中的插口 接口与内核中的协议实现之间的层次关系。 1.socket结构 插口代表一条通信链路...
  • TODD911
  • TODD911
  • 2014年09月08日 11:31
  • 2236

从二分类到多分类的迁移策略

hit2015spring晨凫追风\frac{hit2015spring}{晨凫追风}一般情况下问题研究为二分类问题,在解决多分类问题时有时可以直接推广到多分类,有时不能,不能推广的时候主要用三种拆分...
  • hit2015spring
  • hit2015spring
  • 2017年06月07日 18:54
  • 852

XGBoost:二分类问题

本文介绍XGBoost的命令行使用方法。Python和R的使用方法见https://github.com/dmlc/xgboost/blob/master/doc/README.md 。  下面将介...
  • flyinghorse_2012
  • flyinghorse_2012
  • 2016年01月17日 20:43
  • 1035
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态规划问题详解(二)
举报原因:
原因补充:

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