【动态规划】| 动态规划入门 | 背包问题| 本文仅仅简述01背包问题

一,动态规划


什么是动态规划?
相比较贪心的单峰形式的局部最优求解全局最优解,我们要知道的是在一些问题中我们有一些是不是单峰的,我们需要去让整个问题重叠成有连续的子问题,在保证每次子问题进行完成之后是最优解的状态。


什么叫做单峰?

类似一个吃饭问题,我们连续吃9天,求解吃饭所用最少多少钱?已经知道每天有个最小的吃饭标准(最少吃X元) ,前后两天的吃饭最小标准互不影响。

这个问题我们就可以进行转化 ,也就是先求每天的吃饭所用的标准,然后再进行取和就行了,这就是贪心思想


动态规划的多步决策呢?

还是类比一个吃饭问题,我们连续吃9天,求解吃饭所用最少多少钱?已经知道每天有个最小的吃饭标准(最少吃X元) ,前后两天的吃饭最小标准相互影响

这个问题我们就不能像贪心那样的转化,这种就是一个动态的问题,我们需要去更新的是每次的状态的最优解,然后基于每次状态再更新每次状态的最优解。


动态规划的步骤图解

1 , 下面是解题所设计到的思路
在这里插入图片描述
2 , 解题技巧

从大问题到小问题 : 递归记忆化的解决办法
从小问题到大问题 : 制表递推的解决办法

// 到现在我还是只见过制表

3 , 解题的框架设计

DP 解题分成两个部分 : 第一部分是DP的状态表示 , 第二部分是DP的状态转移方程 。
我们再来看一下图的解释 。
在这里插入图片描述


二,DP中常见的例题

目录
AcWing 2. 01背包问题
AcWing 3. 完全背包问题
AcWing 4. 多重背包问题
AcWing 5. 多重背包问题 II
AcWing 9. 分组背包问题


01背包问题

解题思路

首先是01背包问题,我们直接从设计的角度出发,状态表示和状态转移方程。我们来看状态表示这里,状态表示我们选用的是背包的容量,F[i] 表示的当背包内装的东西比 i 小或者是等于的时候所占的最小的大小,我们再来构建状态转移方程,状态转移方程的构建就是 if ( i > v[i] ) {f[i] = max ( f[i] , f[i - v[i]] + w[i]} ,思路比较简单的。

解题代码

#include <iostream>
using namespace std ;

const int N = 1010 ; 
int n , m ;
int v[N] , w[N] ;
int f[N] ;
int main ()
{
    cin >> n >> m ;
    for(int i = 1 ; i <= n ; i ++ )
        cin >> v[i] >> w[i] ;
    for(int i = 1 ; i <= n ; i ++ )
    {
        for(int j = m ; j >= v[i] ; j ++ )
        {
            f[j] = max ( f[j] , f[ j - v[i]] + w[i]);
        }
    }
    cout << f[m] << endl ; 

    return 0 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值