当前位置: 首页 > article >正文

5 动态规划解分割等和子串

来源:LeetCode第416题

难度:中等

描述:给你一个只包含正整数的非空数组nums,请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等

分析:相当于从nums数组中选取一些元素,使得他们的和为总和/2

递归求解:

public Boolean getSum(int []nums)
{
int sum=0;
for(int number:nums)
{
sum+=number;
}
if(sum%2!=0)
{return false;
​​​​​​​}
return GetSum(nums,sum/2,0)
}
public Boolean GetSum(int []nums,int sum,int index)
{
if(index>=nums.length)
{
if(sum==0)
{
return 1;
}else
{
return 0;
}
}

return GetSum(nums,sum-nums[index],index+1)||GetNum(nums,sum,index+1);
}

可以看做是一个背包问题dp[i][j]表示前i个字符是否能组成和为j的部分dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i]];

public Boolean getSum2(int[]nums)
{
int sum=0;
for(int number:nums)
{
sum+=number;
}
if(sum%2!=0)
{
return false;
}
Boolean dp[][]=new Boolean [nums.length][sum>>1];
if(nums[0]==0)
{
dp[0][0]=true;
}else{
dp[0][0]=false;
}
for(int i=1;i<nums.length;i++)
{
if(nums[i]==0)
{
dp[i][0]=true;
}else
{
dp[i][0]=dp[i-1][0];
}
}

for(int i=1;i<nums.length;i++)
{
for(int j=0;j<sum>>1;j++)
{
if(nums[i]<=j)
{
dp[i][j]=dp[i-1][j]||dp[i-1][j-nums[i]];
}else
{
dp[i][j]=dp[i-1][j];
}

}
}
return dp[nums.length-1][num>>1];
}


http://www.kler.cn/a/145877.html

相关文章:

  • 65,【5】buuctf web [SUCTF 2019]Upload Labs 2
  • 【生产力工具】ChatGPT for Windows桌面版本安装教程
  • 解决conda create速度过慢的问题
  • 资料03:【TODOS案例】微信小程序开发bilibili
  • EXCEL的一些用法记录
  • 2025CSP-J 冲刺训练(3):前缀和差分
  • bootstrap 5 登录、注册页面
  • Java小游戏“简易版王者荣耀”
  • YOLOV7主干改进,使用fasternet轻量化改进主干(完整教程)
  • 人工智能|机器学习——循环神经网络的简洁实现
  • Docker 命令详解
  • hivesql 将json格式字符串转为数组
  • 飞翔的鸟小游戏
  • 医保线上购药系统:引领医疗新潮流
  • 【古诗生成AI实战】之四——模型包装器与模型的训练
  • 数字图像处理-Matlab实验
  • Doris单机部署——2.0.1.1版本
  • 单例模式-C++实现
  • 使用 Vue3 + Pinia + Ant Design Vue3 搭建后台管理系统
  • 有理数比较
  • 计算机图形学-变换基础
  • Linux 面试题(一)
  • zookeeper 单机伪集群搭建简单记录
  • AUTOSAR汽车电子嵌入式编程精讲300篇-汽车CAN总线安全性模糊测试
  • docker network容器网络通信
  • 机器学习【02】在 Pycharm 里使用 Jupyter Notebook