Array sum is K - DP

CF 1073E. Segment Sum(digit DP) 题目链接 E. Segment Sum 分析 可以说很经典了,数位 dp,关于数位dp我也才学 数位dp 这个题目与 仅统计个数有点不同的地方在于,它要求值的和,而对于整数来说每个位是可以独立相加的,可是如果仅仅用一个状态 dp[st][pos][0/1] 表示吃状态下的最终结果的话,可能不行,因为比如 1232** 1233** 这两种情况其实是在一个 dp 状态下的 st = 111,pos ... 阅读详情

求出一个数组arr中有没有那几个数加起来等于S,有,返回true 没有返回false。

分析:

eg:arr={2,4,6,3}  S=10;

动态规划可以这么理解:1、很多个重叠子问题 2、选或者不选的问题

对于数组中的每一个数,比如例子中的3,如果选择,则需要3之前的数可以组成S-3=7

按下标i表示:

                    如果选:f(i,S)=f(i-1,S-arr[i]);

                    如果不选:f(i)=f(i-1,S)

再考虑问题的出口:当数组只有一个元素,此时返回arr[0]==S;

当S=0,即f(i,S)中S为0,说明在i的后面的数组中已经有加起来等于S的数,则返回true,

如果arr[i]>S ,则直接计算f(i-1,S)即可。

动态规划可以用递归的方式完成,但复杂度为O(2^n),因为它是由大到小的推,比如要算f(i),要算f(i-1),而动态规划是从小到大,先计算f(i),再计算f(i+1),把每次的结果存储下来,最后复杂度变为O(n)。

下面是代码实现:rec_subSet是递归实现,dp_subSet是动态规划实现。

package test;


public class Main {
	
	public static boolean rec_subSet(int[] arr,int i,int S){
		if(S==0)
			return true;
		if(i==0)
			return arr[i]==S;
		if(arr[i]>S){
			return rec_subSet(arr,i-1, S);
		}
		return rec_subSet(arr, i-1, S-arr[i])||rec_subSet(arr, i-1, S);
	}
	
	public static void dp_subSet(int[] arr,int S) {
boolean[][] subSet = new boolean[arr.length][S+1];
    	
    	for(int i = 0; i <= arr.length-1; i++){
    		subSet[i][0] = true;
    	}
    	
    	for(int i = 0; i <= S; i++){
    		subSet[0][i] = false;
    		if(i==arr[0])
    			subSet[0][arr[0]] = true;
    	}
    	
    	for(int i = 1; i <= arr.length-1;i++){
    		for(int s = 1;s<=S;s++){
    			if(arr[i]>s)
    				subSet[i][s] = subSet[i-1][s];
    			else {
					subSet[i][s] = (subSet[i-1][s-arr[i]]) || (subSet[i-1][s]);
				}
    		}
    	}
    	System.out.println(subSet[5][S]);
	}
    public static void main(String[] args) {
    	
    	int[] arr = {3,34,4,12,5,2};
    	int S = 9;
    	dp_subSet(arr, S);
    	System.out.println(rec_subSet(arr,arr.length-1,S));
    }
     
}


TL3562/3568内核驱动移植实战:解决无锡沐创N500L-AM4网口异常问题 本文详细介绍了在TL3562/3568平台上移植无锡沐创N500L-AM4网卡驱动的实战经验,重点解决了第四个网口通讯异常问题。通过升级驱动版本至rnpgbe-0.2.3,生成关键头文件并正确配置内核,最终实现四个网口稳定工作。文章还提供了性能优化建议和避坑指南,为类似硬件驱动移植项目提供参考。 阅读详情

相关推荐

华硕笔记本+Ubuntu 20.04:用cpupower解决Intel CPU频率上不去/功耗墙问题实战

本文详细介绍了在华硕笔记本Ubuntu 20.04系统下使用cpupower工具解决Intel CPU频率受限和功耗墙问题的实战方法。通过禁用Intel P-State驱动、配置userspace模式以及高级调优技巧,帮助用户突破性能瓶颈,提升编译和计算效率。

weixin_42561476的博客 525

dp基础之难点解析K Sum

问题:给定数组A,包含n个互不相等的正整数,问有多少种方式从中找出K个数,使得和为arget 例: A = [1,2,3,4].K = 2,Target = 5 输出:2(1,4;2,3) 问题分析: 考虑最后一步A[n-1]是否选入这K个数     case1:A[n-1]不选入,则需要在前n-1个数里选K个数使得和为Target     case2:A[n-1]选入,则需要在前n-1个数里选...

lerry13579的博客 485

群晖NAS变身私有Git服务器:DS218+部署与TortoiseGit客户端实战指南

本文详细介绍了如何将群晖NAS(如DS218+)变身为私有Git服务器,并配置TortoiseGit客户端实现高效代码管理。通过硬件检查、系统更新、Git Server套件安装及权限配置等步骤,帮助开发者在局域网内搭建安全、高速的代码托管环境,特别适合小团队协作。

weixin_29252171的博客 224

动态规划-判断某个数是否可以由数组中的数字组合相加而成

#include <iostream> #include <cstdio> using namespace std; bool rec_subset(int arr[],int i, int s) { //递归方式 if (s == 0) return true; //出口1 else if (i == 0) return arr[0] == s; //出口2 e...

czj981014的博客 3132

图数据挖掘 ECC K-core core number truss number clique

K-core:什么叫k-core,给定一个正整数k(k>=0),k-core是一个G的最大子图(也就是说k-core是一个图的限制),将这个子图定义为Hk,对于Hk中的每个顶点v,他的度数都是大于等于k的。 k-core是内嵌的,如下图所示,集合{ABCD}是H3,也就是3-core的子图。而集合{ABCDE}是H2,也就是2-core的子图,集合{ABCDEGF}是H1,也就是1-core的子图,而从集合的角度来讲H3<H2<H1。 core number:什么叫kcor

weixin_45193103的博客 1686

Qlib+backtrader:2014.1.1-2023.9.20最新回测结果,可以实盘吗?

今年以来,在研究了qlib和backtrader的基础上,把二者结合起来进行了一个策略研究。简单说就是用qlib在200只股票的股票池中进行滚动训练与预测(walk forward),总体数据范围是2005到2023年,以20日间隔滚动训练和预测,最终得到2014.1.1-2023.9.20共10年测试期的收益率预测结果。将预测结果代入backtrader进行回测,得到如下回测结果。

qtbgo的博客 1783

动态规划

递归写法(速度慢): def fibonacci(n): if n in (1, 2): return 1 return fibonacci(n - 1) + fibonacci(n - 2) print(fibonacci(8)) 非递归形式: def fibonacci(n): if n in (1, 2): return 1 ...

youyoudao 647

舵机操作手册

微型伺服马达原理与控制(中鸣) 1、微型伺服马达内部结构一个微型伺服马达内部包括了一个小型直流马达;一组变速齿轮组;一个反馈可调电位器;及一块电子控制板。其中,高速转动的直流马达提供了原始动力,带动变速(减速)齿轮组,使之产生高扭力的输出,齿轮组的变速比愈大,伺服马达的输出扭力也愈大,也就是说越能承受更大的重量,但转动的速度也愈低。 2、微行伺服马达的工作原理一个微型伺服马达是一个典型闭环反馈系统,其原理可由下图表示: 减速齿轮组由马达驱动,其终端(输出端)带动一个线性的比例电位器作位置检测,该电位器把

HEIMENGER的博客 3137

【算法】k-sum 问题

2sum问题 这道题在剑指 offer 上面有,具体的链接为https://www.nowcoder.com/practice/390da4f7a00f44bea7c2f3d19491311b?tpId=13&amp;tqId=11195&amp;tPage=3&amp;rp=3&amp;ru=/ta/coding-interviews&amp;qru=/ta/coding-interview...

qiaoXiong的技术博客 3107

ArcGIS Pro中协同区位熵方法在商业选址分析中的应用

本文详细介绍了如何利用ArcGIS Pro中的协同区位熵方法进行科学的商业选址分析。该方法通过量化目标客户与竞争对手在空间上的关联程度,精准识别市场空白区与竞争红海,帮助决策者从“凭感觉”转向“用数据说话”,有效提升选址成功率和投资回报。

weixin_29214559的博客 361

Python控制TEMI1000/TEMI1500测试温箱

该温箱是我司从昆山振弘检测设备有限公司采购的TEMI 1000,但是控制器用的是韩国的,关于控温箱这个项目,可参考的资料仅有一份官方的manual,里面包含一些命令格式。只要你有温箱,就应该可以向厂家索取该文档。该温箱的通讯接口只有一个RS232接口,要想实现远程控制,需要有串口转USB的线;类似于下图所以,想依靠python来与之进行通信,还是要通过python 的pyserial库,关于怎么安装pyserial,过于简单,这里不做赘述,可自行百度。

xgh1951的博客 1万+

Leetcode 410. Split Array Largest Sum

dp[i][j] 表示将数组中前j个数字分成i组所能得到的最小的各个子数组中最大值 i的范围是[1, j] 计算dp[i][j]时,对于所有1<=k<=j-1: 最后一个分组为nums[k+1]…nums[j]时,此时各个子数组中最大值为max(sum(nums[k+1:j+1]), dp[i-1][k]) 遍历k得到最小的dp[i][j] 最终返回 dp[m][n] 即可 class Solution { public: int spli...

I_ren的博客 336

Python中的字典(Dictionary)学习

上一章节,我们学习了列表(List) 和 元组(tuple) 来表示有序集合。而我们在讲列表(list)的时候,我们用了列表(list) 来存储用户的姓名。那么如果我们为了方便联系这些童鞋,要把电话号码也添加进去,该怎么做呢?但是这样很不方便,我们把电话号码记录下来,就是为了有什么事能及时联系上这些童鞋。如果用列表来存储这些,列表越长,我们查找起来耗时就越长。

热情、奔放、快乐编程! 503

410. Split Array Largest Sum

410. Split Array Largest Sum Given an array which consists of non-negative integers and an integer m, you can split the array into m non-empty continuous subarrays. Write an algorithm to minimize ...

qq_24436311的博客 231

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

1043. Partition Array for Maximum Sum

1043. Partition Array for Maximum Sum方法1: dynamic programming Given an integer array A, you partition the array into (contiguous) subarrays of length at most K. After partitioning, each subarray has ...

wilzxu的博客 435

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Leetcode - 629. K Inverse Pairs Array

leetcode - 629

sinat_41679123的博客 1034

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Array Without Local Maximums 计数DP

Ivan unexpectedly saw a present from one of his previous birthdays. It is array of n numbers from 1 to 200. Array is old and some numbers are hard to read. Ivan remembers that for all elements at leas...

weixin_43916298的博客 254

[LeetCode 410] Split Array Largest Sum

Given an array which consists of non-negative integers and an integerm, you can split the array intomnon-empty continuous subarrays. Write an algorithm to minimize the largest sum among thesemsub...

ExcitedZhang的博客 198

【leetcode】1043. Partition Array for Maximum Sum

题目如下: Given an integer arrayA, you partition the array into (contiguous) subarrays of length at mostK. After partitioning, each subarray has their values changed to become the maximum value of t...

weixin_34281477的博客 231

Split Array Largest Sum

Given an array which consists of non-negative integers and an integerm, you can split the array intomnon-empty continuous subarrays. Write an algorithm to minimize the largest sum among thesemsub...

leetcode 解题思路 385

[Leetcode] Split Array Largest Sum

Given an array which consists of non-negative integers and an integer m, you can split the array into m non-empty continuous subarrays. Write an algorithm to minimize the largest sum among these m suba

yy254117440的博客 641

Leetcode 3366. Minimum Array Sum

Leetcode 3366. Minimum Array Sum

codename_cys的博客 425

leetcode 410. Split Array Largest Sum

https://leetcode-cn.com/problems/split-array-largest-sum/ 有两种思路。一种是dp。对于 [0,j] 之间的元素要分成 i组。则可以对于所有 0<=k<j,都可以将[0,k]分成 i-1组。[k,j]分生一组。看两部分最大值哪个大。取大的即可。复杂度是O(mn^2) class Solution { public: ...

汤瑞的博客 213
上一篇: String-intern()
下一篇: 求最长回文子串(Manacher)算法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值