动态规划典型题:给定正整数n,将其划分为正整数的和,求划分方法数

整数划分是一类常见的动态规划问题,但是根据条件不同会导致细节上的差异。写这篇博文是自己找这类问题的解法时发现如果不注意这些细节可能会导致错误,所以做一个区分。

1、无限制划分

这类问题的最常规呈现形式是:
(1)给定一个正整数n,将其划分为正整数的和,求有多少种划分方法
即将n表示为n=m1+m2+…+mi; (其中mi为正整数,并且1 <= mi <= n),则{m1,m2,…,mi}为n的一个划分。

其他的呈现形式还能表现为:
(2)有n件完全相同的物品。现将其分成若干份,并保证每份中至少有1件物品,求有多少种划分方法

解法

首先将求解的问题表示为一个函数,并找到状态转移方程
(1)问题函数化
设f(n,m)表示 “将n划分为正整数的和,并且这个划分中最大值不超过m” 符合该条件的划分数
比如符合f(5,3)的划分包括{(3,2)(3,1,1)(2,2,1)(2,1,1,1)(1,1,1,1,1)}

可能大家会疑惑为什么要这么去formulate这个问题。因为问题中,划分之间是无序的,也就是说(2,1,1)和(1,1,2)是同一个划分,所以要使用最大值来作为一个标志才能使问题的规模又上到下逐渐简化,最后变成许多简单子问题的求解,其实这也是dp这种方法的思想精髓。

(2)状态转移方程
基础状态:
当n=1时,不论m取何值,只有一种分法{(1)},即 f ( 1 , m ) = 1 f(1,m)=1 f(1,m)=1
当m=1时,也只有一种分法,将n分为n个1, f ( n , 1 ) = 1 f(n,1)=1 f(n,1)=1
状态转移:
对任意 f ( n , m ) f(n,m) f(n,m)
①如果m>n,则该最大值限制相当于无限制, f ( n , m ) = f ( n , n ) f(n,m) = f(n,n) f(n,m)=f(n,n)
②如果m=n,那么这个时候一种分法是就将n划分为(n),除此之外的划分方法的最大值都不会超过m-1(也就是n-1),所以此时
f ( n , m ) = 1 + f ( n , m − 1 ) f(n,m)=1+f(n,m-1) f(n,m)=1+f(n,m1)
③如果m<n,那么情况会稍微复杂一些,n的划分可以分为两种情况:
第一种是最大值正好为m的,这样的划分总共有 f ( n − m , m ) f(n-m,m) f(nm,m)种,这是因为问题就转化为从n中先划出m后,再继续划分n-m,接下来的划分的最大值也可以是m
第二种情况就是不包含最大值m的划分,这样问题就转化为

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值