IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 动态规划之整数划分 -> 正文阅读

[数据结构与算法]动态规划之整数划分

纠结了很久的整数划分,终于搞懂了,做笔记做笔记!!!

首先是问题描述与常见文字描述:

【问题求解】设n=5,k=5,对应的拆分方案有:

① 5=5

② 5=4+1

③ 5=3+2

④ 5=3+1+1

⑤ 5=2+2+1

⑥ 5=1+1+1+1

⑦ 5=1+1+1+1+1?

为了防止重复计数,让拆分数保持从大到小排序。正整数5的拆分数为7。

采用动态规划求解整数拆分问题。设f(n,k)为n的k拆分的拆分方案个数:

(1)当n=1,k=1时,显然f(n,k)=1。 ? ?

(2)当n<k时,有f(n,k)=f(n,n)。 ? ?

(3)当n=k时,其拆分方案有将正整数n无序拆分成最大数为n-1的拆分方案,以及将n拆分成1个n(n=n)的拆分方案,后者仅仅一种,所以有f(n,n)=f(n,n-1)+1。

(4)当n>k时,根据拆分方案中是否包含k,可以分为两种情况: ? ? ?

? ? ?① 拆分中包含k的情况:即一部分为单个k,另外一部分为{x1,x2,…,xi},后者的和为n-k,? ? ?后者中可能再次出现k,因此是(n-k)的k拆分,所以这种拆分方案个数为f(n-k,k)。

? ? ?

?

? ? ?② 拆分中不包含k的情况:则拆分中所有拆分数都比k小,即n的(k-1)拆分,拆分方案个数为? ? ? f(n,k-1)。

? ?

?状态转移方程:

?显然,求f(n,k)满足动态规划问题的最优性原理、无后效性和有重叠子问题性质。所以特别适合采用动态规划法求解。设置动态规划数组dp,用dp[n][k]存放f(n,k)。对应的完整程序如下:

int dp[MAXN][MAXN];			//动态规划数组
void Split(int n,int k)		//求解算法
{  for (int i=1;i<=n;i++)
      for (int j=1;j<=k;j++)
      {  if (i==1 || j==1)
            dp[i][j]=1;
         else if (i<j)
            dp[i][j]=dp[i][i];
         else if (i==j)
            dp[i][j]=dp[i][j-1]+1;
         else
            dp[i][j]=dp[i][j-1]+dp[i-j][j];
      }
}

不知道别人怎么样,我对于这个问题的文字描述不太懂,后来我自己找了不少资料,这才有了自己的理解:

上面的状态转移方程f(n,k)我们可以看成把数字n分成最多k份的所有方案个数(注意是所有,即1~k份),对于这个状态转移方程,下面是我的理解:

(1)n=1或k=1:即把1分成k份,或者把n分成1份,其分法都只有一种

(2)n<k:把n分成k份,显然n最多分成n份,所以f(n,k)=f(n,n)

(3)n=k:把n分成k份,我们可以分为分成k份的和其他份数(1~k-1),分成k份只有一种,而分成其他份数的有f(n,k-1),所以f(n,k)=f(n,k-1)+1

(4)n>k:把n分成k份,类似(3),我们把份数分为k份和其他份数(1~k-1),其他份数表示为:f(n,k-1),而分成k份的因为必须分成k份,所以我们先每一份分1,还剩n-k,然后把n-k正常分成最多k份,表示为:f(n-k,k),即f(n,k)=f(n,k-1)+f(n-k,k)

有的小伙伴可能不太理解为什么(3)和(4)都是同样的分法,为什么分成k份的在(3)只有1种,而在(4)中有f(n-k,k)种,这里我解释一下,在(3)中n=k,分成k份每一份为1,而在(4)中,分成k份,肯定存在有的一份大于1的,所以两者有区别。

还可能有像 “认为(4)中的f(n-k,k)应该是f(n,k),因为要把n分成k份” ,实际上,如果这样认为,有一点没弄清楚,那就是f(n,k)的定义,f(n,k)是把数字n分成最多k份的所有方案个数(注意是所有,即1~k份),也就是既要分成k份还要分成k-1份,k-2份,k-3份,...,1份,所以,你懂了吗!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-11 12:57:43  更:2021-11-11 12:58:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:47:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码