动态规划典型题目/

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. 解决Vue项目打包之后放到nginx下刷新就报错404的问题

    最近跟着某机构的教学视频敲了一遍vue项目,但是在windows环境下部署的时候就懵逼了放到nginx下正常跑没问题,但是刷新之后就报404错误 前端项目构建vue 脚手架版本 是@vue/cli 4 ...

  2. 纯代码实现wordpress图片本地化【5.2.2版本可用】

    最近用wordpress做了个网站,想复制些新闻过来用,但图片是别人的,就想怎么本地化,在网找到了方法,那就保存一下方法. 复制下面的代码,然后粘贴到你当前WordPress主题的模版函数(funct ...

  3. Java基础之(一):JDK的安装以及Notepad++的下载

    从今天开始就开始我的Java的学习了,学习Java前需要做一些前期的准备工作.好了,现在我们先一起来安装JDK. JDK的安装 JDK下载链接:JDK 下载电脑对应的版本,同意协议 双击安装JDK 将 ...

  4. C# datagridview、datagrid、GridControl增加行号

    01 - WinForm中datagridview增加行号 在界面上拖一个控件dataGridView1,在datagridview添加行事件中添加如下代码: private void dataGri ...

  5. 痞子衡嵌入式:超级下载算法RT-UFL v1.0在恩智浦MCUXpresso IDE下的使用

    痞子衡主导的"学术"项目 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计> v1.0 版发布近 4 个月了,部分客户已经在实际项目开发调试中用上了这个 ...

  6. Java:TreeMap类小记

    Java:TreeMap类小记 对 Java 中的 TreeMap类,做一个微不足道的小小小小记 概述 前言:之前已经小小分析了一波 HashMap类.HashTable类.ConcurrentHas ...

  7. VUE调用子窗口弹窗或组件弹窗,关闭弹窗刷新父级页面主页面,通过this.$emit来实现

    this.$emit是父级向自己传值 第一步在父级页面创建自己页面的引用 <template> <div> <edit ref="edit" @ref ...

  8. spring security中ajax超时处理

    spring security为我们的系统提供了方便的认证和授权操作.在系统中完成认证和授权后,一般页面页面上大多数是ajax和后台进行操作,那么这个时候可能就会面临session超时,ajax去访问 ...

  9. MySQL 的架构与组件

    MySQL 的逻辑架构图设计图 连接/线程处理:管理客户端连接/会话[mysql threads] 解析器:通过检查SQL查询中的每个字符来检查SQL语法,并为每个SQL查询生成  SQL_ID. 此 ...

  10. 【JavaScript基础】Js的定时器(你想看的原理也在哟)

    [JavaScript基础]Js的定时器(你想看的原理也在哟) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 本章是经历 ...