动态规划

动态规划

简介

https://www.cnblogs.com/loveer/p/11786100.html

动态规划遵循一套固定的流程:递归的暴力解法( O(2^n) ) -> 带备忘录的递归解法( O(n) ) -> 非递归的动态规划解法( O(n) )。
「自顶向下」:
    是从上向下延伸,
    都是从一个规模较大的原问题比如说 f(20),向下逐渐分解规模,直到 f(1) 和 f(2) 触底,然后逐层返回答案。
「自底向上」:
    直接从最底下,最简单,问题规模最小的 f(1) 和 f(2) 开始往上推,直到推到我们想要的答案 f(20)

解法:

1. 将原问题分解为子问题
    f(0),f(1),f(2)...f(n)
2. 确定状态
    f(n)
3. 确定一些初始状态(边界条件)的值
    f(n)=0
4. 确定状态转移方程(当前子问题值与前一个子问题值的关系)
    f(n) 是一个状态 n,这个状态 n 是由状态 n - 1 和状态 n - 2 相加转移而来,这就是状态转移
    动态规划问题最困难的就是写出状态转移方程。

适合使用动规求解的问题

1. 问题具有最优子结构(问题的最优解所包含的子问题的解也是最优的)
2. 求最优解问题

动态规划问题

1. 0-1背包问题

①、将原问题分解为子问题(子问题和原问题形式相同,且子问题解求出就会被保存); 
②、确定状态:0-1背包中一个状态就是N个物体中第i个是否放入体积为V背包中; 
③、确定一些初始状态(边界状态)的值; 
④、确定状态转移方程,如何从一个或多个已知状态求出另一个未知状态的值。(递推型)

在这里插入图片描述

案例:

给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
注意:

每个数组中的元素不会超过 100
数组的大小不会超过 200

示例 1:

输入: [1, 5, 11, 5]
输出: true
解释: 数组可以分割成 [1, 5, 5][11].

示例2:

输入: [1, 2, 3, 5]
输出: false
解释: 数组不能分割成两个元素和相等的子集.
Python
class Solution:    
   def canPartition(self, nums: List[int]) -> bool:        
   # 0-1 背包问题        
       sums=sum(nums)        
       if sums%2!=0:return False        
       else:avg=int(sums/2)        
       B = [[False for _ in range(avg + 1)] for _ in range(len(nums))]
       for i in range(avg + 1):            
           B[0][i] = False if nums[0] != i else True        
       for i in range(1,len(nums)):            
           for j in range(1,avg+1):                
               if j<nums[i]:                    
                  B[i][j]=B[i-1][j]                
               else:                    
                  B[i][j]=B[i-1][j] or B[i-1][j-nums[i]]        
       return B[-1][-1]       
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值