算法学习->整数拆分问题
动态规划典型题目/
00 题目
将正整数n无需拆分为最大数为k的拆分方案有多少种?
要求所有的拆分方案不重复。
示例:
输入:n=5,k=5
输出:(5,5)=7
示例分析:
5=5
5=4+1
5=3+2
5=3+1+1
5=2+2+1
5=2+1+1+1
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 }
算法学习->整数拆分问题的更多相关文章
- 算法学习之C语言基础
算法学习,先熟悉一下C语言哈!!! #include <conio.h> #include<stdio.h> int main(){ printf(+); getch(); ; ...
- C / C++算法学习笔记(8)-SHELL排序
原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...
- LeetCode 343. 整数拆分(Integer Break) 25
343. 整数拆分 343. Integer Break 题目描述 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积. 每日一算法2019/5/2 ...
- LeetCode 343.整数拆分 - JavaScript
题目描述:给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积. 题目分析 题目中"n 至少可以拆分为两个正整数的和",这个条件说 ...
- DSP算法学习-过采样技术
DSP算法学习-过采样技术 彭会锋 2015-04-27 23:23:47 参考论文: 1 http://wr.lib.tsinghua.edu.cn/sites/default/files/1207 ...
- HDU 4651 Partition(整数拆分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4651 题意:给出n.求其整数拆分的方案数. i64 f[N]; void init(){ f[0 ...
- Python之路,Day21 - 常用算法学习
Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的 ...
- LightOJ 1336 Sigma Function(数论 整数拆分推论)
--->题意:给一个函数的定义,F(n)代表n的所有约数之和,并且给出了整数拆分公式以及F(n)的计算方法,对于一个给出的N让我们求1 - N之间有多少个数满足F(x)为偶数的情况,输出这个数. ...
- LightOJ 1341 Aladdin and the Flying Carpet(整数拆分定理)
分析:题目并不难理解,就是一些细节上的优化需要我们注意,我在没有优化前跑了2000多MS,优化了一些细节后就是400多MS了,之前还TLE了好几次. 方法:将整数拆分为质因子以后,表达为这样的形式,e ...
随机推荐
- GKCTF 2021 Reverse Writeup
前言 GKCTF 2021所以题目均以开源,下面所说的一切思路可以自行通过源码对比IDA进行验证. Github项目地址:https://github.com/w4nd3r-0/GKCTF2021 出 ...
- stm32-HAL使用usart发送中断判断发送标志库问题
前言: stm32是嵌入式MCU开发中最多应用的芯片,很早之前我们开发ST芯一般都是标准库开发,标准库简洁好读,现在要配合CubeMX生成代码,所以官方主推HAL库和LL库,但是HAL代码冗杂很绕,因 ...
- 迁移appseting.json创建自定义配置中心
创建一个自定义的配置中心,将框架中各类配置,迁移至数据库,支持切换数据库,热重载. 说在前面的话 自使用.net Core框架以来,配置大多存在json文件中: [框架默认加载配置]文件为appset ...
- Serverless 架构到底要不要服务器?
作者 | aoho 来源 | Serverless 公众号 Serverless 是什么? Serverless 架构是不是就不要服务器了?回答这个问题,我们需要了解下 Serverless 是什么. ...
- 从零入门 Serverless | SAE 的极致应用部署效率
作者 | 文俊 阿里巴巴云原生团队 本文整理自<Serverless 技术公开课>,"Serverless"公众号后台回复"入门",即可获取系列文章 ...
- Vue2源码解读 - 响应式原理及简单实现
直接进入主题了,想必大家都知道实现vue响应式核心方法就是 Object.defineProperty,那就从它开始说 Object.defineProperty 缺点: 深度监听,需要递归到底,一次 ...
- 关于takin-data,你想知道的都在这里(一)启动命令篇
通过docker部署体验takin的小伙伴都应该知道,在安装部署手册中有提到:在启动surge-deploy任务前,需要将启动命令中的ip参数替换为docker容器所在宿主机的ip,很多小伙伴都在这里 ...
- Java:并发笔记-02
Java:并发笔记-02 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 3. 共享模型之管程-1 本章内容-1 共享问题 synchronized 线程安全分 ...
- netty传输java bean对象
在上一篇博客(netty入门实现简单的echo程序)中,我们知道了如何使用netty发送一个简单的消息,但是这远远是不够的.在这篇博客中,我们来使用netty发送一个java bean对象的消息,但是 ...
- 认真讲说static关键字
static 关键字主要有以下四种使用场景 修饰成员变量和成员方法 静态代码块 修饰类(只能修饰内部类) 静态导包(用来导入类中的静态资源,1.5之后的新特性) 修饰成员变量和成员方法(常用) 被 s ...