动态规划典型题目/

00 题目

将正整数n无需拆分为最大数为k的拆分方案有多少种?

要求所有的拆分方案不重复。

示例:

输入:n=5,k=5

输出:(5,5)=7

示例分析:

  1. 5=5

  2. 5=4+1

  3. 5=3+2

  4. 5=3+1+1

  5. 5=2+2+1

  6. 5=2+1+1+1

  7. 5=1+1+1+1+1

所以一共七种。

01 思路

01-1 类型

求解这一问题的思路有很多,在这里是想作为动态规划的例题进行分析。所以采用动态规划。

01-2 算法

使用动态规划,最重要的是状态转移方程

简单说就是当前状态对下一状态,依据限制条件,进行决策的函数。

来想一下,n和k的关系:

  • n=1或者k=1时,显然 f(n,k)=1;

  • n<k时,有 f(n,k)=f(n,n);

  • n=k时,f(n,n)=f(n,n-1)+1

    • //即将k降一次的感觉,因为这种情况必有一种拆分是他自己,比如上面的5,5

  • n>k时,我们考虑一下,会有两种大的情况:

    • 第一种,n的拆分里有k,那这一大类其实相当于f(n,k)=f(n-k,k)

    • 第二种,n的拆分里没k,那就是拆分里所有数都比k小,即n的(k-1)的拆分,即f(n,k)=f(n,k-1);

02 代码

这样的代码就很好实现。

典型动态规划实现的话,就只有嵌套循环和if-else循环。

 1 //求解n的k拆分
2 #include<stdio.h>
3 #include<string.h>
4 #define MAXN 500
5 int dp[MAXN][MAXN];
6 void Split(int n, int k){
7 for(int i = 1; i <= n; i++){
8 for(int j = 1; j <= k; j++){
9 if(i == 1 || j == 1){
10 dp[i][j] = 1;
11 }
12 else if(i < j){
13 dp[i][j] = dp[i][i];
14 }
15 else if(i == j){
16 dp[i][j] = dp[i][j-1]+1;
17 }
18 else{
19 dp[i][j] = dp[i][j-1] + dp[i-j][j];
20 }
21 }
22 }
23 }
24 int main(){
25 int n=5,k=5;
26 memset(dp, 0, sizeof(dp));
27 Split(n,k);
28 printf("(%d, %d)=%d",n,k,dp[n][k]);
29 return 0;
30 }
31

因为这个问题是递归的,所以可以采用递归来写,解决过程是自顶向下的。当然就在递归过程中将算过的子问题放进dp数组,在后续dp不等0时就是此前已经算过了,直接return就行。

这种方法也叫备忘录法

 1 #include<stdio.h>
2 #include<string.h>
3 #define MAXN 500
4 int dp[MAXN][MAXN];
5 int dpf(int n, int k){
6 if(dp[n][k] != 0)return dp[n][k];
7 if(n == 1 || k == 1){
8 dp[n][k] = 1;
9 return dp[n][k];
10 }
11 else if(n < k){
12 dp[n][k] = dpf(n, n);
13 return dp[n][k];
14 }
15 else if(n == k){
16 dp[n][k] = dpf(n, k-1)+1;
17 return dp[n][k];
18 }
19 else{
20 dp[n][k] = dpf(n, k-1)+dpf(n-k, k);
21 return dp[n][k];
22 }
23 }
24 int main(){
25 int n=5,k=5;
26 memset(dp, 0, sizeof(dp));
27 printf("(%d, %d)=%d",n,k,dpf(n,k));
28 return 0;
29 }

算法学习->整数拆分问题的更多相关文章

  1. 算法学习之C语言基础

    算法学习,先熟悉一下C语言哈!!! #include <conio.h> #include<stdio.h> int main(){ printf(+); getch(); ; ...

  2. C / C++算法学习笔记(8)-SHELL排序

    原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...

  3. LeetCode 343. 整数拆分(Integer Break) 25

    343. 整数拆分 343. Integer Break 题目描述 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积. 每日一算法2019/5/2 ...

  4. LeetCode 343.整数拆分 - JavaScript

    题目描述:给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积. 题目分析 题目中"n 至少可以拆分为两个正整数的和",这个条件说 ...

  5. DSP算法学习-过采样技术

    DSP算法学习-过采样技术 彭会锋 2015-04-27 23:23:47 参考论文: 1 http://wr.lib.tsinghua.edu.cn/sites/default/files/1207 ...

  6. HDU 4651 Partition(整数拆分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4651 题意:给出n.求其整数拆分的方案数. i64 f[N]; void init(){    f[0 ...

  7. Python之路,Day21 - 常用算法学习

    Python之路,Day21 - 常用算法学习   本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的 ...

  8. LightOJ 1336 Sigma Function(数论 整数拆分推论)

    --->题意:给一个函数的定义,F(n)代表n的所有约数之和,并且给出了整数拆分公式以及F(n)的计算方法,对于一个给出的N让我们求1 - N之间有多少个数满足F(x)为偶数的情况,输出这个数. ...

  9. LightOJ 1341 Aladdin and the Flying Carpet(整数拆分定理)

    分析:题目并不难理解,就是一些细节上的优化需要我们注意,我在没有优化前跑了2000多MS,优化了一些细节后就是400多MS了,之前还TLE了好几次. 方法:将整数拆分为质因子以后,表达为这样的形式,e ...

随机推荐

  1. Dapr逐渐被点燃

    Dapr被点燃 Dapr的热度个人认为才刚刚热起来,9月份我写了Dapr + .NET Core实战一共10篇,从基础概念到简单的实战,但是有很多人感兴趣,具体表现在我个人维护的QQ群,人数从80人左 ...

  2. IDEA Web渲染插件开发(一)— 使用JCEF

    目前网上已经有了很多关于IDEA(IntelliJ平台)的插件开发教程了,本人觉得简书上这位作者秋水畏寒的关于插件开发的文章很不错,在我进行插件开发的过程中指导了我很多.但是综合下来看,在IDEA上加 ...

  3. 遇到括号就是栈(bushi)

    CF508E Arthur and Brackets 我在赛场上想都没想直接DP \(O(n^3)\)过了 但别人说正解是栈+贪心 讲讲DP \(bool\) \(dp[i][j]\)表示从第i对括号 ...

  4. Salesforce 生命周期管理(一)应用生命周期浅谈

    本篇参考: https://trailhead.salesforce.com/en/content/learn/trails/determine-which-application-lifecycle ...

  5. PTA实验4-2-3 验证“哥德巴赫猜想” (20分)

    实验4-2-3 验证"哥德巴赫猜想" (20分) 数学领域著名的"哥德巴赫猜想"的大致意思是:任何一个大于2的偶数总能表示为两个素数之和.比如:24=5+19, ...

  6. Java(40)网络编程

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201659.html 博客主页:https://www.cnblogs.com/testero ...

  7. C++/CLR 使用(VS2012,VS2013,VS2015)编写

    转载自:http://www.th7.cn/system/win/201509/129417.shtml VS2010以及以前的版本,创建项目时都可以在CLR下找到"Windows窗体应用程 ...

  8. spark 解决错误java.io.InvalidClassException

    今天遇到一个现场问题,任务报错java.io.InvalidClassException.在开发环境是没有报错的,正式环境报错.大概类似于下面这样(非报错原文,摘自网上同类博客) java.io.In ...

  9. Sequence Model-week1编程题2-Character level language model【RNN生成恐龙名 LSTM生成莎士比亚风格文字】

    Character level language model - Dinosaurus land 为了构建字符级语言模型来生成新的名称,你的模型将学习不同的名字,并随机生成新的名字. 任务清单: 如何 ...

  10. TX-LCN分布式事务之LCN模式

    什么是LCN模式 LCN模式是TX-LCN分布式事务模式的一种,L-lock-锁定事务单元.C-confirm-确认事务模块状态. notify-通知事务单元 原理 LCN模式是通过Spring AO ...