复杂的整数划分

article/2025/10/7 20:26:14

复杂的整数划分

又到了动态规划的时间了!

记得我之前讲过的三要素哦

下面这一条题目其实思路并不是非常的难,但是在细节处理上要非常仔细,而且它有3个相互独立的动态规划问题。

总时间限制:
200ms
内存限制:
65536kB

描述

将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整数n 的这种表示称为正整数n 的划分。

输入
标准的输入包含若干组测试数据。每组测试数据是一行输入数据,包括两个整数N 和 K。
(0 < N <= 50, 0 < K <= N)
输出
对于每组测试数据,输出以下三行数据:
第一行: N划分成K个正整数之和的划分数目
第二行: N划分成若干个不同正整数之和的划分数目
第三行: N划分成若干个奇正整数之和的划分数目
样例输入

5 2

样例输出

2
3
3

提示
第一行: 4+1, 3+2,
第二行: 5,4+1,3+2
第三行: 5,1+1+3, 1+1+1+1+1+1

其实比较简单是问题2,3,特别是问题3。
当问题2你再三琢磨,显然他是一个简单版本01背包问题,所以套路就非常明显了。

对于问题一而言的话,可能会出现看两种情况:

  1. 设计出了非常常规的子问题和状态,但是无法写出状态转移方程,或者细节遗漏
  2. 无法想出子问题

其实根据这种题目的思路,设计出状态是比较简单的,主要讲一下状态转移方程:
当然这个第一题的状态转移方程或许首次做题时候是比较难想的

//i被分成j份的拆法return dp1[i][j]=dp11(i-1,j-1)+dp11(i-j,j);//项里面至少有一个1的+没有1的

有1的容易,没有1的我建议可以通过试探的方法得出上面得结论
如果你的数字感觉比较好,那也是分分钟可以目测出来的,😝。

然而着还没有结束的哦,你要好好想一下触发上面转移方程得条件哦

下面呈现我的代码

//by Gary
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;const int N=80;
//dp[i][j]
int dp1[N][N];  //i被分成j份的拆法
int dp2[N][N]; //前i个数凑成j的方法
int dp3[N][N];  //同2
int dp11(int i,int j)
{//初始状态和边界if(dp1[i][j]!=-1) return dp1[i][j];if(i==j||j==1||j==0) return dp1[i][j]=1;if(i==0) return dp1[i][j]=0;if(i>=j+j)return dp1[i][j]=dp11(i-j,j)+dp11(i-1,j-1);return dp1[i][j]=dp1[i-1][j-1];//全部分法当中都一定有1
}
//01背包问题 填满 w[i]=i
int dp22(int i,int j)
{if(j==0)return 1;if(i==0)return 0;if(dp2[i][j]!=-1) return dp2[i][j];//减少重复计算了int result=dp22(i-1,j);//不取iif(i<=j)result+=dp22(i-1,j-i);//取dp2[i][j]=result;return result;
}int dp33(int i,int j)
{if(j==0)return 1;if(i==0)return 0;if(dp3[i][j]!=-1)return dp3[i][j];int result=dp33(i-1,j);//不取if(i%2&&i<=j)result+=dp33(i,j-i);//可以相同dp3[i][j]=result;return result;
}
int main()
{int n,k;memset(dp1,0xff,sizeof(dp1));memset(dp2,0xff,sizeof(dp2));memset(dp3,0xff,sizeof(dp3));while(cin >> n >> k) {cout << dp11(n,k) <<endl;cout << dp22(n,n) << endl;cout << dp33(n,n) <<endl;}return 0;
}

这个代码或许确实不太美观,实在不好意思😂

当然正如我前面讲过的,状态的设置会直接决定你后面思考的难度。
后面思考难度的降低,当然也可能引起状态设置难度的上升😫

第一小题,我再提供一种别人的状态的设置

int waysNK[M][M][M]; // waysNK[i][j][k] 用 <= i的k个数,凑出和为j 
int WaysNK(int i,int j,int k) {if( j == 0 && k == 0)return 1;if( k == 0)return 0;if( j == 0)return 0;if( i == 0)return 0;if( waysNK[i][j][k] != -1)return waysNK[i][j][k];int result = WaysNK(i-1,j,k);if( j >= i) result += WaysNK(i,j-i,k-1);waysNK[i][j][k] = result;return result;}

**其他优秀题解
**
拓展:01背包问题

学会程序和算法,走遍天下都不怕
在这里插入图片描述丽江玉龙雪山


http://chatgpt.dhexx.cn/article/HgQi4cQA.shtml

相关文章

整数划分(DP)

一个正整数 n 可以表示成若干个正整数之和&#xff0c;形如&#xff1a;nn1n2…nk&#xff0c;其中 n1≥n2≥…≥nk,k≥1。 我们将这样的一种表示称为正整数 n 的一种划分。 现在给定一个正整数 n&#xff0c;请你求出 n 共有多少种不同的划分方法。 输入格式 共一行&#x…

【算法】整数划分问题

描述 整数划分问题是算法中的一个经典命题之一。把一个正整数n表示成一系列正整数之和&#xff1a; 正整数n的这种表示称为正整数n的划分。正整数n的不同划分个数称为正整数n的划分数&#xff0c;记作P(n) 。 正整数6有如下11种不同的划分&#xff0c;所以P(6)11。 6 51 42, …

【递归】整数划分(C++)

一、什么是整数划分 所谓整数划分&#xff0c;是指把一个正整数n写成如下形式&#xff1a; n m 1 m 2 ⋅ ⋅ ⋅ m i nm_1m_2m_i nm1​m2​⋅⋅⋅mi​&#xff1b; 其中 m i m_i mi​为正整数&#xff0c;并且 1 ≤ m i ≤ n 1 \leq m_i \leq n 1≤mi​≤n&#xff0c;则 { …

整数划分问题的递归解决(详解)

整数划分问题 这个问题在网上其实有好多博客、文章&#xff0c;本人认为讲的都稍有粗略&#xff0c;这篇文章是个人写的认为稍微详细一点的&#xff01;&#xff01; 将正整数n表示为一系列正整数之和&#xff0c; nn1n2n3n4......nk &#xff08;其中&#xff0c;n1>n2&…

整数划分算法

整数划分问题 问题阐述 将正整数n表示成一系列正整数之和&#xff1a;nn1n2…nk&#xff0c; 其中n1≥n2≥…≥nk≥1&#xff0c;k≥1。 正整数n的这种表示称为正整数n的划分。 输入&#xff1a;一个正整数n 输出&#xff1a;n不同划分个数以及n的划分结果。 问题实例 …

整数划分总结

博客原地址&#xff1a;https://blog.csdn.net/dacc123/article/details/50664738 整数划分问题&#xff1a; 笼统上说就是将一个整数划分成若干个整数之和的方案数。整数划分有很多不同的问法&#xff0c;也有比较隐晦的问法。比如n个苹果放到m个盘子里&#xff0c;比如n个砖块…

整数划分问题(分治算法经典)

题目描述&#xff1a; 整数划分问题是将一个正整数n拆成一组数连加并等于n的形式&#xff0c;且这组数中的最大加数不大于n。 即&#xff1a;nn1n2…nk; n1>n2>n3…>nk 如整数的6划分为: 6 5 1 4 2, 4 1 1 3 3, 3 2 1, 3 1 1 1 2 2 2, 2 2 1 1, 2 1 …

数据源:SHP数据下载平台

1. 地理信息专业知识服务系统 中国工程院 中国工程科技知识中心 2. 国家基础地理信息中心 自然资源部 国家基础地理信息中心 3. 天地图API 自然资源部 国家基础地理信息中心 4. 中国科技资源共享网 科技部 国家科技资源共享服务工程技术研究中心 5. 地球大数据科学工…

使用ARCGIS对shp数据添加投影坐标系

系统工具箱→data management tool→投影和变换→定义投影 输入需要添加投影的shp 选择需要的投影坐标系

【使用QGIS入库将shp数据导入postgis、postgres数据库】

使用QGIS入库将shp数据导入postgis、postgres数据库 第一步&#xff0c;安装并打开QGIS软件 第二步&#xff0c;连接PostGIS数据库 在弹出的连接信息界面中配置数据库连接参数 输入数据库连接参数后点击ok 数据库连接成功则自动保存配置信息 第三步&#xff0c;打开数据导入…

2.1.2Arcpy开发记录_shp数据类型描述

Demo实现功能&#xff1a;print出输入.shp的数据类型&#xff0c;如线&#xff0c;面&#xff0c;点 官方文档&#xff1a;Describe 对象属性—ArcMap | 文档 本机环境&#xff1a;ArcGIS10.3&#xff0c;Python27 import arcpy import osfolder rE:/2021work/TJ_J/pythonT…

geotools将shp数据存入postgres

一、引入geotools的依赖 引入geotools的方法 <dependency><groupId>org.geotools</groupId><artifactId>gt-shapefile</artifactId><version>27-SNAPSHOT</version></dependency><dependency><groupId>org.geot…

全国高铁线路及站点shp数据(2020年)

名称&#xff1a;全国高铁线路及站点shp数据&#xff08;2020年&#xff09; 区域范围&#xff1a;全国 时间范围&#xff1a;2020 语言&#xff1a;中文 格式&#xff1a;.shp 该数据为2020年的全国范围的高铁线路和站点数据&#xff0c;格式为shp格式&#xff0c;坐标为wgs19…

深圳市“详规一张图”shp数据爬取后数据表无法打开的问题解决办法

最近在研究爬取深圳市规自局网站上的“详规一张图”数据&#xff0c;无奈爬虫技术太低&#xff0c;无意中看到了大佬“Atom数据”的“深圳详规“一张图”数据获取【代码更新】”一文中给出的代码爬取方案&#xff0c;再次感谢&#xff01; 然而在经历了千辛万苦之后终于将详规一…

FME将用SHP数据对栅格影像数据进行裁剪

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、需求二、实操 1.数据准备2.FME的流程设置3.裁剪的结果总结 前言 利用FME对数据进行操作与处理的过程。 一、需求 裁剪出shp范围内或者范围外的栅格影像数…

三步教你免费下载省,市,区县行政区Shp数据

摘要&#xff1a;一般非专业的GIS应用通常会用到省市等行政区区划边界空间数据做分析&#xff0c;本文简单介绍了如何在互联网上下载省&#xff0c;市&#xff0c;区县的shp格式空间边界数据&#xff0c;并介绍了一个好用的在线数据转换工具&#xff0c;并且开源。 一、首先&a…

数据处理(1):十万加SHP数据重载导入标准字段图层

使用工具&#xff1a;Arcgis 时常我们会从客户、网络得到数据&#xff0c;但是数据里面字段名于公司规定得字段名有出入&#xff0c;此时就需要进行数据调整&#xff0c;首先我们打开软件“ArcCatalog” 在任意文件夹下右击&#xff0c;选择“新建-文件地理数据库”&#xff0c…

shp数据中文乱码的一种恢复方法

一、准备 1、QGIS软件 2、乱码识别网站 二、转换步骤 &#xff08;一&#xff09;示例展示 如图&#xff0c;有一个不知道怎么产生的shp文件&#xff0c;在arcmap中&#xff0c;中文字段显示乱码&#xff0c;添加cpg文件后&#xff0c;仍然无法解决。 &#xff08;二&…

【GlobalMapper精品教程】053:打开dbf文件并生成有坐标系的shp数据

本文讲解在globalmapper汇总打开dbf文件并生成有坐标系的shp数据。 文章目录 一、dbf文件解读二、打开dbf文件二、另存为shp文件一、dbf文件解读 我们可以通过Excel或FME等多种软件查看dbf的结构,字段有:Name,kind,Lat,Lon,其中Lon为经度,Lat为纬度,我们后续一定是通过…

html 显示shp,cesium加载本地shp数据

用户选择本地磁盘shp数据后,直接在三维球上展示。本文默认已经有了vue和cesium整合后的工程。 官网地址:git://github.com/wavded/js-shapefile-to-geojson.git 1、vue-cli3.x+cesium的项目目录 image.png 2、CesiumViewer.vue代码: 加载shp数据 import Cesium from cesium/…