整数划分(计数类dp)-java

整数划分我们主要通过两种思路来对这道题就行解决。

文章目录

前言

一、整数划分

二、模拟完全背包

三.代码如下

1.代码如下

2.测试样例

3.代码运行结果

四、计数类dp

4.1算法思路

 4.2代码如下

总结


前言

整数划分我们主要通过两种思路来对这道题就行解决。


提示:以下是本篇文章正文内容,下面案例可供参考

一、整数划分

一个正整数 n 可以表示成若干个正整数之和,形如:n=n1+n2+…+nk,其中 n1≥n2≥…≥nk,k≥1。

我们将这样的一种表示称为正整数 n 的一种划分。

现在给定一个正整数 n,请你求出 n共有多少种不同的划分方法。

二、模拟完全背包

我们可以把1到n看成背包的容积,然后n1、n2.....nk看成物品,这个问题就转化成不限物品的次数,且恰好能装满背包容量的问题

我们引入二维数组dp,dp[i][j]表示的含义是用前i个数构成整数j所需要的方案数。

图1.1思路模拟 

第i个数不用时:

dp[i][j] = dp[i-1][j] 

当我们用第i个数时:

dp[i][j] = dp[i-1][j] + dp[i][j-i]

 

dp[i][j-i] = dp[i-1][j-1*i]+dp[i-1][j-2*i]+dp[j-3*i]...... 

这一步跟完全背包类似,不同的是我们需要求所有的方案之和。

当然我们还需要考虑一些边界情况比如当j为0的时候,我们本身就有一种由0构成的方案

dp[i][0] = 1

n\geqslant i\geqslant 0  

三.代码如下

1.代码如下

package AcWing;import java.io.*;
import java.util.*;public class 整数划分 {static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static int M =(int) 1e9+7;public static void main(String[] args) {Scanner sc = new Scanner(br);int n = sc.nextInt();int[][] dp = new int[1010][1010];for(int i = 0;i <= n;i++){//相当于总和为0,那么我们可以由0构成,也是一种方案dp[i][0] = 1;}//相当于哪个物品for(int i = 1;i <= n;i++){for(int j = 1; j <= n;j++){dp[i][j] = dp[i-1][j] % M;if(j >= i){dp[i][j] = (dp[i][j-i]+dp[i-1][j])%M;}}}pw.println(dp[n][n]);pw.flush();}
}

2.测试样例

5

3.代码运行结果

7

四、计数类dp

4.1算法思路

我们引入二维数组dp,dp[i][j]表示 所有总和为i,恰好为j个数相加的方案数。那么我们就可以枚举

图4.1模拟思路 

 dp[i][j]的值就可以分成两种情况:

(1)当被拆分的整数里面的最小值是1是,那我们就可以让取dp[i-1][j-1]的值,即我们减去一个已知的最小值1,剩下总和为i-1,恰好由j-1个数构成的方案数。

(2)当被拆分的整数里面的最小值大于i时,那么我们先减去j个1,那么总和为i-j的由j个数构成的方案里面的最小值就一定是大于1的,即dp[i-j][j]

dp[i][j] = dp[i-1][j-1]+dp[i-j][j]

那么我们最后输入的结果为:

result = dp[n][1] + dp[n][2].....+dp[n][n]

 4.2代码如下


import java.io.*;
import java.util.*;public class Main {static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));static int mod = (int)1e9+7;public static void main(String[] args) {Scanner sc = new Scanner(br);int n = sc.nextInt();int[][] dp = new int[1010][1010];dp[0][0] = 1;for(int i = 1; i<= n;i++){//总和为i,那么最多就有i个数相加for(int j = 1;j <= i;j++){dp[i][j] = (dp[i-1][j-1] + dp[i-j][j])%mod;}}int res = 0;for(int i = 1; i<= n;i++){//这里注意也要对mod取余,防止结果爆intres =(res + dp[n][i]) % mod;}pw.println(res);pw.flush();}}

总结

还是主要对状态转移方程的递推和对dp数组的理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/614726.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gradle 实战 - 检查不用包 -ApiHug准备-工具篇-010

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace ApiHug …

Vue - 5( 11000 字 Vue2 入门级教程)

一&#xff1a;Vue 初阶 1.1 组件自定义事件 在 Vue 中&#xff0c;组件间通过自定义事件进行通信是一种常见的模式。自定义事件允许子组件向父组件发送消息&#xff0c;也可以在组件内部进行事件的绑定、触发和解绑。让我们详细讲解这些知识点。 1.1.1 组件自定义事件 在 …

【位运算】Leetcode 判定字符是否唯一

题目解析 算法讲解 正常思路&#xff1a;使用unordered_map判断并保存每一个字符出现的次数&#xff0c;如果当前的字符在添加到Hash之前已经出现了一次了&#xff0c;直接返回false&#xff0c;反之循环结束返回true 优化思路&#xff1a;可以使用位图来充当Hash表&#xff…

2024年危险化学品经营单位安全管理人员证考试题库及试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年危险化学品经营单位安全管理人员证考试题库及危险化学品经营单位安全管理人员试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff0…

酷开科技OTT大屏营销:开启新时代的营销革命

随着互联网技术的不断发展和普及&#xff0c;大屏已经成为越来越多家庭选择的娱乐方式。在这个背景下&#xff0c;酷开科技凭借其强大的技术实力和敏锐的市场洞察力&#xff0c;成功地将大屏转化为一种新的营销渠道&#xff0c;为品牌和企业带来了前所未有的商业机会。 酷开科技…

阿里云大学生免费申请7个月云服务器,免费续费半年

2024年阿里云学生服务器免费申请&#xff0c;完成学生认证可以领取1个月免费学生机&#xff0c;完成任务可以再免费学费6个月时长&#xff0c;还可以领取高校计划学生300元无门槛优惠代金券&#xff0c;阿里云服务器网aliyunfuwuqi.com整理2024年最新阿里云大学生服务器申请入口…

AndroidAutomotive模块介绍(一)整体介绍

前言 Android Automotive 是一个基本 Android 平台&#xff0c;可运行 IVI 系统中预安装的 Android 应用以及可选的第二方和第三方 Android 应用。 本系列文档将会系统的介绍 Android Automotive 的功能、架构、逻辑等。模块逻辑将从 应用api接口、系统服务、底层服务&#x…

PostgreSQL数据库基础--简易版

数据库 其中runoobdb为数据库名 查看已经存在的数据库 \l进入数据库 \c runoobdb创建数据库 CREATE DATABASE runoobdb;删除数据库 DROP DATABASE runoobdb;表 其中COMPANY为表名 创建表格 CREATE TABLE COMPANY(ID INT PRIMARY KEY NOT NULL,NAME TEXT…

DedeCMS 未授权远程命令执行漏洞分析

dedecms介绍 DedeCMS是国内专业的PHP网站内容管理系统-织梦内容管理系统&#xff0c;采用XML名字空间风格核心模板&#xff1a;模板全部使用文件形式保存&#xff0c;对用户设计模板、网站升级转移均提供很大的便利&#xff0c;健壮的模板标签为站长DIY自己的网站提供了强有力…

Vim:强大的文本编辑器

文章目录 Vim&#xff1a;强大的文本编辑器Vim的模式命令模式常用操作光标移动文本编辑查找和替换 底行命令模式常用操作Vim的多窗口操作批量注释与去注释Vim插件推荐&#xff1a;vimforcpp结论 Vim&#xff1a;强大的文本编辑器 Vim&#xff0c;代表 Vi IMproved&#xff0c;…

SpringAI初体验之HelloWorld

目录 前言1.准备工作2.初始化项目3.解决问题3.1 Connection Time out 连接超时问题3.2 You exceeded your current quota 额度超限问题 4.访问调用5.总结 前言 在逛SpringBoot页面时突然看到页面上新增了一个SpringAI项目,于是试了一下&#xff0c;感觉还行。其实就是封装了各家…

业务架构扩展六大元素

背景 目前主流的业务架构就是价值流能力&#xff0c;在这套架构体系中&#xff0c;有四个核心元素&#xff0c;分别是价值流、业务能力、信息、组织。上个章节已经讲述&#xff1a; 业务架构的四大核心元素-CSDN博客 这一节&#xff0c;对于外围的六个扩展元素&#xff0c;逐…