DP25 子集和问题 Subset Sum Problem @geeksforgeeks

JAVA算法:子集求和问题(Subset Sum Problem) JAVA算法:子集求和问题(Subset Sum Problem) 题目:给定一个正整数数组,和一个目标值,找出是否存在数组的一个子数组,使得子数组元素之和等于目标值。 例如:给定数组{ 3, 2, 7, 1} 和目标值S = 6 返回结果:True , 子数组为(3, 2, 1} 问题分析: 使用递归算法和动态规划算法两种算法来求解上述问题。 递归算法 对于数组中的每个元素... 阅读详情

同分割区间问题:http://blog.youkuaiyun.com/fightforyourdream/article/details/17602699

Given a set of non-negative integers, and a value sum, determine if there is a subset of the given set with sum equal to given sum.

Examples: set[] = {3, 34, 4, 12, 5, 2}, sum = 9
Output:  True  //There is a subset (4, 5) with sum 9.

Let isSubSetSum(int set[], int n, int sum) be the function to find whether there is a subset of set[] with sum equal to sum. n is the number of elements in set[].

The isSubsetSum problem can be divided into two subproblems
…a) Include the last element, recur for n = n-1, sum = sum – set[n-1]
…b) Exclude the last element, recur for n = n-1.
If any of the above the above subproblems return true, then return true.

Following is the recursive formula for isSubsetSum() problem.

isSubsetSum(set, n, sum) = isSubsetSum(set, n-1, sum) || 
                           isSubsetSum(arr, n-1, sum-set[n-1])
Base Cases:
isSubsetSum(set, n, sum) = false, if sum > 0 and n == 0
isSubsetSum(set, n, sum) = true, if sum == 0
 
The above solution may try all subsets of given set in worst case. Therefore time complexity of the above solution is exponential. The problem is in-fact NP-Complete (There is no known polynomial time solution for this problem).

We can solve the problem in Pseudo-polynomial time using Dynamic programming. We create a boolean 2D table subset[][] and fill it in bottom up manner. The value of subset[i][j] will be true if there is a subset of set[0..j-1] with sum equal to i., otherwise false. Finally, we return subset[sum][n]




package DP;

public class SubsetSum {

	public static void main(String[] args) {
		int[] set = {3, 34, 4, 12, 5, 2};
		int n = set.length;
		int sum = 9;
		System.out.println(isSubsetSumRec(set, n, sum));
		System.out.println(isSubsetSumDP(set, n, sum));
	}
	
	public static boolean isSubsetSumRec(int[] set, int n, int sum){
		if(sum < 0){
			return false;
		}
		if(sum == 0){
			return true;
		}
		if(n==0 && sum>0){
			return false;
		}
		
		// not select last element || select last element
		return isSubsetSumRec(set, n-1, sum) || isSubsetSumRec(set, n-1, sum-set[n-1]);
	}
	
	public static boolean isSubsetSumDP(int[] set, int n, int sum){
		// The value of subset[i][j] will be true if there is a subset of set[0..j-1]
	    //  with sum equal to i
		boolean[][] subset = new boolean[sum+1][n+1];
		
		for(int i=0; i<=n; i++){		// If sum is 0, then answer is true
			subset[0][i] = true;
		}
		
		for(int i=1; i<=n; i++){		// If sum is not 0 and set is empty, then answer is false
			subset[i][0] = false;
		}
		
		for(int i=1; i<=sum; i++){		// sum
			for(int j=1; j<=n; j++){	// n
				subset[i][j] = subset[i][j-1];	// not select last element
				if(i-set[j-1] >= 0){		// select last element
					subset[i][j] = subset[i][j] || subset[i-set[j-1]][j-1];
				}
			}
		}
		
		return subset[sum][n];
	}

}


子集和 题目比较简单,我口动描述一下吧: 定义一个子集的和为该子集中所有数的和,特别的,定义空集的和为0. 现在已知一个非空多重整数集合S的每个子集的和,请你构造出原集合S。 有多个,则排序元素并输出字典序最小的那个。 |S|<=60;给出序列个数n<=10000;嗯,我是个从来不会DP选手啊。 这题就是DPDP,因为这个集合会有负数,正数和0; 如果有0,每个子集和的个数都会翻倍(不能单看0的个 阅读详情

相关推荐

查找匹配子集与子集和(Subset Sum Problem)--动态规划实现

问题和实现引自资料:https://en.wikipedia.org/wiki/Subset_sum_problem 介绍 子集和问题(英语:Subset sum problem),又称子集合加总问题,是计算复杂度理论和密码学中一个很重要的问题。问题可以描述为:给一个整数集合,问是否存在某个非空子集,使得子集内中的数字和为0。例:给定集合{−7, −3, −2, 5, 8},答案是...

TG's Maze 5076

动态规划法(三)子集和问题(Subset sum problem)

  继续讲故事~~  上次讲到我们的主人公丁丁,用神奇的动态规划法解决了杂货店老板的两个找零钱问题,得到了老板的肯定。之后,他就决心去大城市闯荡了,看一看外面更大的世界。  这天,丁丁刚回到家,他的弟弟小连就拦住了他,“老哥,有个问题想请教你。”对于一向数学见长的小连,这次竟然破天荒的来问自己问题,丁丁感到不可思议:他俩一个以计算机见长,...

weixin_34195546的博客 1716

subsetsum:子集和

子集和 子集和 给定一个目标值和一个要从中选择的数字列表,从列表中选择数字,这样所选择的数字加起来就是目标值。 例如,如果给定目标值 150 和一个由 1、2、100、22 和 28 组成的数字列表,则正确答案将是 100、22 和 28,因为 100 + 22 + 28 = 150。 如果给定目标值为 30 并且要从中选择的样本数为 1、2、100、22 和 28,则正确答案将是 28 和 2,因为 28 + 2 = 30。 注意:一旦您使用了列表中的数字你不能再次选择它。 注意:如果没有数字组合与请求的值相加,则正确答案是“没有组合匹配”。 注意:正确答案可能不止一个。 例如,对于目标值 3 和列表 1、2 和 3,正确答案是:1、2 或 3。您只需要返回 1 个正确答案,而不是全部。 编写一个从命令行获取数字列表的程序。 第一个数字是目标值,数字的提示(无论有多少)是您必须从中挑选的

【运筹优化】子集和问题(Subset Sum Problems , SSP)介绍 + 动态规划求解 + Java代码实现

子集和问题(Subset Sum Problems , SSP),它是复杂性理论中最重要的问题之一。SSP会给定一组整数a1,a2,....,ana1​,a2​,....,an​,最多nnn个整数,我们需要判断是否存在一个非空子集,使得子集的总和为MMM整数?如果存在则需要输出该子集。例如,集合给定为[5,2,1,3,9][5,2,1,3,9],子集之和为999;答案是肯定的,因为子集[5,

知不足而奋进,望远山而前行 2万+

Holtek BS45F3833芯片深度剖析:如何用高集成MCU重塑超声波雾化市场格局?

本文深度剖析Holtek BS45F3833芯片如何通过高集成MCU技术重塑超声波雾化市场。该芯片集成了PWM直驱、电容检水、触摸控制等核心功能,显著提升雾化精度和效率,同时降低BOM成本和开发难度。文章通过实测数据和实战案例,展示了其在香薰机、车载设备及工业加湿器等场景的创新应用,为开发者提供了一站式解决方案。

weixin_29192211的博客 413

hi3519dv500 os04a10输入调试

因该sensor接在soc端的iic6,在驱动中(Hi3519DV500_SDK_V2.0.1.1\smp\a55_linux\source\mpp\cbb\isp\user\sensor\hi3519dv500\omnivision_os04a10\os04a10_sensor_ctl.c)注意总线的选择。mem_process_isolation=1 改为 mem_process_isolation=0。2、OT_MIPI_SET_HS_MODE配置为LANE_DIVIDE_MODE_1。

linus 3164

子集的和(动态规划DP)

子集的和 总时间限制: 1000ms 内存限制: 65536kB 描述 对于从1到N (1 &lt;= N &lt;= 71) 的连续整数集合,能划分成两个子集合,且保证每个集合的数字和是相等的。举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,每个子集合的所有数字和是相等的: {3} 和 {1,2} 这是唯一一种分法(交换集合位置被认为是同一种...

qq_42995099的博客 2155

Colmap中 patchmatch源码

惊世骇俗的Colmap PatchMatch源码 500多行,简明易懂 先了解PatchMatch的options: max_image_size: 任一维度的最大图像尺寸 gpu_index: gpu的下标 depth_min,depth_max: 随机采样的深度范围 window_radius:用于计算NCC(两图片的归一化互相关),NCC的计算需要用到 win_size. 图像匹配 | NCC 归一化互相关损失 | 代码 + 讲解 - 知乎 (zhihu.com) window_step: 用.

qq_24884193的博客 2209

9.动态规划-子集和问题Subset Sum Problem

Given a set of non-negative integers and a value sum, the task is to check if there is a subset of the given set whose sum is equal to the given sum.Examples:Input: set[] = {3, 34, 4, 12, 5, 2}, sum = 9Output: TrueExplanation: There is a subset (4, 5) with

qq_73625278的博客 1509

Dify视觉模型节点避坑指南:我用Qwen2.5-VL做OCR识别时踩过的3个坑(及解决方案)

本文分享了使用Dify平台和Qwen2.5-VL视觉模型进行OCR票据识别时遇到的三个常见问题及解决方案,包括文件变量传递、结构化输出和条件分支判断失效。通过实战经验,帮助开发者优化多模态模型在财务自动化中的应用,提升OCR识别精度和效率。

weixin_29284885的博客 401

Lora无线温湿度传感器方案

综上所述,Lora无线温湿度传感器以其长距离传输、低功耗、高稳定性、精准测量、无线传输以及广泛的应用场景等特点,在环境监测领域展现出了强大的竞争力和广泛的应用前景。Lora无线温湿度传感器广泛应用于各种需要远程监控和数据采集的场景,如仓储、农业、机房、楼宇、交通、工业、矿产、电力等领域。Lora无线温湿度传感器是一种采用Lora无线通信技术进行数据传输的温湿度监测设备。四、产品参数(以某款工业级Lora温湿度传感器为例)

weixin_46632654的博客 757

Subset-Sum Problem 子集和问题

递归求解子集和问题的思路 子集和问题: 给定一个集合S和一个目标值t,求问是否能从S中找出一个子集,使得这个子集元素之和等于目标值t 假设有一个集合S = {-1, 2, 7, 10},一个目标值t = 8。那么我们可以找到S的一个子集S1 = {-1, 2, 7} 各项之和等于8。 解决子集和问题的基本思路是 The inclusion/exclusion pattern,即判断某个元素el...

fujz123的博客 1504

【nvidia-B200】实际生产报错NVRM: nvAssertFailedNoLog: Assertion failed: pIOVAS != NULL @ io_vaspace.c:601

升级 NVIDIA 驱动到 R545/R550 数据中心版本(解决 IOVA bug,这是性能差的根本原因);重启服务器(清理驱动残留资源,消除日志中的 NVRM 错误);验证 NVLink/PCIe 链路(确保 8 卡互联使用高速链路,而非单卡 PCIe 共享带宽)。完成这 3 步后,ncccl-test的all_reduce带宽应能提升至100GB/s 以上(取决于服务器的 NVLink/NVSwitch 配置),恢复正常性能。

jundao1997的专栏 648

DP26树的最大独立子集问题 Largest Independent Set Problem @geeksforgeeks

Given a Binary Tree, find size of the Largest Independent Set(LIS) in it. A subset of all tree nodes is an independent set if there is no edge between any two nodes of the subset. For example, consid

2433

013 PID参数整定:Ziegler-Nichols法

几年前在调试一台伺服压机,客户要求位置精度±0.01mm,响应时间小于50ms。我按照教科书上的经验值设了P=1.5,I=0.02,D=0.01,结果电机一启动就开始尖叫,位置超调直接干到0.3mm,然后开始震荡,像极了喝醉的舞者。现场工程师看我的眼神,就像在看一个刚毕业的实习生。那次之后我明白了一个道理:PID参数不是靠猜的,也不是靠经验公式硬套的。你需要一个系统的方法,而Ziegler-Nichols法就是那个让你从“瞎调”走向“有章可循”的起点。

m0_50546716的博客 99

SAP_PP模块定额工艺路线简介

在 SAP PP(生产计划)模块中,定额工艺路线(Routing) 是生产制造流程中的核心主数据之一,用于定义制造一个产品所需的标准操作步骤。工艺路线详细描述了生产过程中的各个工序、使用的工作中心、标准作业时间、资源分配等信息,是进行生产计划、成本核算、排产控制、车间执行等功能的基础。

我小时候很黑的博客 763

【学习笔记】子集和问题

为啥这个东西越学越觉得蠢啊?

七代目鸽影 1955

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

外教课004_3_complexity_analysis

Complexity analysis Complexity analysis analyses an algorithm establish its correctness determining the amount of resources it needs in this lecture focus on time complexity space complexity - Amount of memory the algorithm needs time complexity - Amoun

小明2766的博客 963

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

子集合加总问题(Subset sum problem)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34409703的博客 784

假人有限元模型

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

如何证明NP-Hard Problems

【1】 经典问题:电路可满足性问题 The circuit satisfiability problem asks, given a circuit, whether there is an input that makes the circuit output TRUE, or conversely, whether the circuit always outputs FALSE. 【2】 P: can besolvedin polynomial time NP: If the answer i..

软件工程小施同学 的专栏 3166

DP·动规·子集和

DP题目信息输入输出测试样例解答想法 题目信息 对于由从1到N (1 <= N <= 39)这N个连续的整数组成的集合来说,我们有时可以将集合分成两个部分和相同的子集合。 例如,N=3时,可以将集合{1, 2, 3}分为{1,2}和{3}。此时称有一种方式(即与顺序无关)。 N=7时,共有四种方式可以将集合{1, 2, 3, ..., 7}分为两个部分和相同的子集合: {1,6,7}和{2,3,4,5} {2,5,7}和{1,3,4,6} {3,4,7} 和{1,2,5,6} {1,2,4,7}

zhj12399的博客 732

A. Even Subset Sum Problem

time limit per test 1 second memory limit per test 512 megabytes input standard input output standard output You are given an arrayaaconsisting ofnnpositive integers. Find anon-emptysubs...

无知的我 822

subset problem(子集和问题)

给定一个包含N个非负数的set, 并且给定K, 从集合中找出一组元素子集, 使得这组子集的各个元素相加起来和是K。  注意, 我们假设输入的set 中的各个元素均是unique的(即 no duplicates present)。 方法一(穷竭搜索subset sum).。 一个比较naive的办法就是考虑这个集合的所有可能的subsets。 不难看出, 给定集合(N个元素)的subset的个

a130737的专栏 2万+

子序列Subset Sum Problem(二)

给定一个数组和子数组长度,打印该数组中所有等于长度的组合子序列 如图: 输入值:{1,2,3,4,5} 输出值:见根节点 #include &lt;iostream&gt; #include&lt;vector&gt; #include&lt;algorithm&gt; using namespace std; void combinationUtil(int arr[],int data[],i...

大橙子的博客 557
上一篇: DP24 最优BST Optimal Binary Search Tree @geeksforgeeks
下一篇: DP26树的最大独立子集问题 Largest Independent Set Problem @geeksforgeeks
chiiis
博客等级 码龄14年 422粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值