首页 > 其他分享 >动态规划(3)

动态规划(3)

时间:2024-01-18 10:47:08浏览次数:24  
标签:遍历 背包 int vector 物品 动态 规划 dp

目录

474

本地的dp数组由于需要考虑0和1两个元素,所以多了一维,是一个三维的dp数组,然后再使用滚动数组降至2维

递推公式:
dp[j][k]=max(dp[j][k],1+dp[j-num0][k-num1]);

class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        //dp[i][j][k]代表有j个0和k个1时,最大子集的长度,取前i个
        int sz=strs.size();
        //vector<vector<vector<int>>> dp(sz,vector<vector<int>>(m+1,vector<int>(n+1,0)));
        vector<vector<int>> dp(m+1,vector<int>(n+1,0));
        dp[0][0]=0;
        for(int i=0;i<sz;i++)
        {
            int num0=0;
            int num1=0;
            for(int j=0;j<strs[i].length();j++)
            {
                if(strs[i][j]=='0')
                {
                    num0++;
                }
                else
                {
                    num1++;
                }
            }
            for(int j=m;j>=num0;j--)
            {
                for(int k=n;k>=num1;k--)
                {
                    dp[j][k]=max(dp[j][k],1+dp[j-num0][k-num1]);
                }
            }
        }
        return dp[m][n];

    }
};

完全背包

与01背包的不同点是:

01背包是每个物品最多取一次
而完全背包不限制物品拿取的次数

所以就造成了遍历顺序的不同

01背包中为了每个物品只拿取一次,滚动数组的遍历是从大到小的

for(int i=0;i<n;i++)
    {
        for(int j=weight;j>=w[i];j--)
        {
            dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
        }
    }

而完全背包为了物品被充分利用,要从小到大去便利

for(int i=0;i<n;i++)
    {
        for(int j=w[i];j<=weight;j++)
        {
            dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
        }
    }

除此之外还有先遍历物品或是先遍历背包的区别:

在求装满背包有几种方案的时候,认清遍历顺序是非常关键的。

如果求组合数就是外层for循环遍历物品,内层for遍历背包。

如果求排列数就是外层for遍历背包,内层for循环遍历物品。

模板题

#include<bits/stdc++.h>

using namespace std;

int main()
{
    int n,weight;
    cin>>n>>weight;
    vector<int> w(n);
    vector<int> v(n);
    for(int i=0;i<n;i++)
    {
        cin>>w[i]>>v[i];
    }
    vector<int> dp(weight+1,0);
    for(int i=0;i<n;i++)
    {
        for(int j=w[i];j<=weight;j++)
        {
            dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
        }
    }
    cout<<dp[weight]<<endl;
    return 0;
}

518零钱兑换

class Solution {
public:
    int change(int amount, vector<int>& coins) {
        //dp数组含义,组成amount有多少种组合
        vector<int> dp(amount+1,0);
        //dp初始化
        dp[0]=1;
        int n=coins.size();
        for(int i=0;i<n;i++)
        {
            for(int j=coins[i];j<=amount;j++)
            {
                dp[j]=dp[j]+dp[j-coins[i]];
            }
        }
        return dp[amount];
    }
};

标签:遍历,背包,int,vector,物品,动态,规划,dp
From: https://www.cnblogs.com/liviayu/p/17971940

相关文章

  • 01分数规划
    01分数规划有\(n\)个物品,每个物品有两个权值\(a_{i}\),\(b_{i}\),现在要去掉\(k\)个物品,使得剩下的\(n-k\)个物品\(\frac{\suma_{i}}{\sumb_{i}}\)有最大值,并求出该最大值。\(\frac{\suma_{i}}{\sumb_{i}}\)=\(\frac{\suma_{i}*w_{i}}{\sumb_{i}*w_{i}}\)(\(w_......
  • 动态规划(2)
    目录01背包二维数组滚动数组416分割等和子集1049最后一块石头的重量494目标和01背包二维数组注意:初始化遍历顺序//二维dp数组实现#include<bits/stdc++.h>usingnamespacestd;intn,bagweight;//bagweight代表行李箱空间voidsolve(){vector<int>weight(n......
  • 数据展现之道:精心打造可在线浏览的动态数据报表
    前言如今各类BI产品大行其道,“数据可视化”成为一个热门词汇。相比价格高昂的各种BI软件,用Excel来制作动态报表就更加经济便捷。今天小编就将为大家介绍一下如何使用葡萄城公司的纯前端表格控件——SpreadJS来实现一个Excel动态报表:实现步骤1.在原始数据的基础上生成数据透视表......
  • Java动态代理、AOP和装饰器模式
    面向切面编程AOP-AspectOrientedPrograming,主要用于处理核心业务逻辑外的一些东西,比如日志和缓存。这个“切面”可以理解为在代码的某个地方切一刀,在其中加一些东西。装饰器以日志为例,如果没有使用AOP,那么可以使用装饰来实现类似的代码。我们使用装饰器模式来实现一下在执行......
  • C99标准前后对于二维数组的动态声明问题
    html:toc:true写在前面:出于作者不了解C99以前标准中对二维数组的动态声明而导致的一场考场事故,作者写下这篇文章,,以便其他同学在遇到类似问题时不要犯同样的错误,同时作为对自己的警醒.本文主要是关于对于二维数组动态声明问题在不同C标准下方法的探讨,将给出一个简......
  • 方法论:仓储物流规划--数据分析(转)
     老K-LaoK专栏同名微信公众号:智能仓储物流技术研习社。​关注他 8人赞同了该文章导语大家好,我是智能仓储物流技术研习社的社长,你的老朋友,老K。知识星球 * 原创电子书 * 深海社区 * 微信群文:尹军琪在做物流规划设计时,人们往往对设计指标......
  • 聊聊如何实现动态加载spring拦截器
    前言之前写过一篇文章聊聊如何实现热插拔AOP,今天我们继续整一个类似的话题,聊聊如何实现spring拦截器的动态加载实现核心思路groovy热加载java+事件监听变更拦截器实现步骤1、在项目的pom引入groovyGAV<dependency><groupId>org.codehaus.groovy</groupI......
  • 动态规划(2)
    目录63不同路径2343整数拆分9663不同路径2遇到障碍,说明该点无法到达,那么dp[i][j]=0classSolution{public:intslnA(vector<vector<int>>&obstacleGrid){intm=obstacleGrid.size();intn=obstacleGrid[0].size();vector<vector<int&g......
  • 山海鲸如何实现动态天气
    1.预设雨雪效果雨雪效果中的雨雪大小和雨雪覆盖如果不需要绑定数据,可以先预设好,这样后续切换后就可以有预设的大小,比如我们先将下雪的雪面覆盖设置成0.5。 设置完之后我们把天气设置为无。2.生成数据字段山海鲸中所有的组件属性都可以绑定动态数据,天气属性也不例外,首先我们......
  • 动态规划(1)
    目录动规基础509斐波那契数列746使用最小花费爬楼梯62不同路径写在前面,第二次刷动规,上次就有点没弄懂这次一定拿下了动规基础铭记动规五部曲:确定dp数组(dptable)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组509斐波那契数列classSolution{......