首页 > 其他分享 >动态规划(4) 完全背包的遍历顺序

动态规划(4) 完全背包的遍历顺序

时间:2024-01-18 11:33:22浏览次数:31  
标签:vector 遍历 爬楼梯 nums int 背包 dp 顺序

目录

377 组合总和 Ⅳ

class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
        int n=nums.size();
        vector<int>dp(target+1,0);
        dp[0]=1;
        for(int j=0;j<=target;j++)
        {
            for(int i=0;i<n;i++)
            {
                if(j>=nums[i]&&dp[j] < INT_MAX - dp[j - nums[i]])
                {
                    dp[j]=dp[j]+dp[j-nums[i]];
                }
            }
        }
        return dp[target];
    }
};

进阶版爬楼梯

其实求排列问题就是爬楼梯
组合问题就是常规dp
因为爬楼梯就是一个排列过程,(2,1)(1,2)在爬楼梯中是两种不同的模式
爬楼梯就要先遍历一遍楼梯再去遍历steps
就像求组合时先去遍历背包,再遍历物品

#include<bits/stdc++.h>

using namespace std;

int main()
{
    int n,m;
    
    cin>>n>>m;
    
    vector<int> dp(n+1,0);
    dp[0]=1;
    for(int i=0;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(i>=j)
            {
                dp[i]+=dp[i-j];
            }
        }
    }
    cout<<dp[n];
    return 0;
}

322零钱兑换

其实这一题的递归公式和dp含义都比较好想出来
但是初始化和一些细节的处理上还是比较难的

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        //dp的含义,dp[j]代表到达j的amount需要的最少的硬币数量
        //因为取最小值,所以递推公式:dp[j]=min(dp[j],dp[j-coins[i]]+1);
        //初始化,很难,dp[0]=0其他的都为INT MAX
        int n=coins.size();
        vector<int> dp(amount+1,INT_MAX);
        dp[0]=0;
        for(int i=0;i<n;i++)
        {
            for(int j=coins[i];j<=amount;j++)
            {
                if (dp[j - coins[i]] != INT_MAX){
                    dp[j]=min(dp[j],dp[j-coins[i]]+1);
                }
            }
        }
        return dp[amount]==INT_MAX?-1:dp[amount];

    }
};

标签:vector,遍历,爬楼梯,nums,int,背包,dp,顺序
From: https://www.cnblogs.com/liviayu/p/17972162

相关文章

  • C++继承顺序
    派生类可以访问基类中所有的非私有成员。因此基类成员如果不想被派生类的成员函数访问,则应在基类中声明为private。我们可以根据访问权限总结出不同的访问类型,如下所示:访问publicprotectedprivate同一个类yesyesyes派生类yesyesno外部的类yesnono......
  • 二叉树结构与递归实现前中后序遍历
    1.二叉树结构2.二叉树节点遍历顺序前序:每颗子树以中—》左—》右遍历ABDEHCFG 中序:每颗子树以左 —》中—》右遍历DBEHAFCG 后序:每颗子树以左 —》右—》中遍历DHEBFGCA 代码实现:publicclassBinaryTree{stat......
  • mysql 语句执行顺序
    MySQL语句的大致执行顺序如下:FROM:指定要查询的表。JOIN:根据指定的条件,将两个或多个表合并为一个结果集。WHERE:对查询结果进行筛选,只保留满足指定条件的行。GROUPBY:将结果集按照指定的列进行分组。WITHROLLUP:按照GROUPBY的列对结果集进行汇总,并添加一......
  • vxe-column 表头顺序:数据中改变后,但视图位置不更新
    问题在左树右表的页面中,左侧点击不同的节点,右侧表头会改变。但在某些情况下,数据中表头顺序改变了,但视图中表头位置却没变。如下图所示:尝试数据变了但视图未更新,猜测是vue更新机制导致的,于是把表头数组的赋值改为$set,无效;猜测是右侧表格组件复用导致数据未更新,(但其实vue-de......
  • 数组遍历的方法
    1、forEach()forEach() 方法对数组的每个元素执行一次给定的函数,不会改变原数组,没有返回值。数组中的每个值都会调用回调函数,回调函数有三个参数:currentValue:必需。当前元素。index:可选。当前元素的索引值。arr:可选。当前元素所属的数组对象。//forEach不会改......
  • 多个异步请求的执行顺序
    Fn(){ //以下两个都为异步请求 this.getData1() this.getData2()}this.Fn()我以为的执行顺序是:getData1-->getData2但其实,顺序不一定,getData1有时在前,有时在后。解决:加上async和awaitasyncFn(){ //以下两个都为异步请求 awaitthis.getData1() awaitthi......
  • 遍历链表,将节点接到末端 【1月16日学习笔记】
    点击查看代码//遍历链表,将节点接到末端#include<iostream>usingnamespacestd;structnode{ intdata;//数据 node*next;//尾巴};//定义节点结构体node*A;//头指针固定,globalvariabl......
  • C#中Page执行顺序:OnPreInit()、OnInit()……
    原文链接:https://www.cnblogs.com/qiudan/archive/2012/11/12/2766876.htmlusingSystem;usingSystem.Data;usingSystem.Configuration;usingSystem.Web;usingSystem.Web.Security;usingSystem.Web.UI;usingSystem.Web.UI.WebControls;usingSystem.Web.UI.WebControls.We......
  • asp.net 页面的事件执行顺序(全)
    原文链接:https://www.cnblogs.com/ishibin/archive/2012/08/14/2638054.html默认的aspx页面都是继承自System.Web.UI.Page,Page基类定义了很多需要预执行的事件,这些事件虽没有在aspx页面中显示的定义或提及,但它们仍然会以一定的顺序去执行,这些事件的执行顺序是:1.OnPreInit 2.......
  • 性能篇:List集合遍历元素用哪种方式更快?
    嗨大家好,我是小米!今天给大家分享一篇关于Java集合框架性能的文章,话题是:“如果让你使用for循环以及迭代循环遍历一个ArrayList,你会使用哪种方式呢?原因是什么?LinkedList呢?”废话不多说,让我们直入主题!ArrayList的get元素源码介绍ArrayList,作为Java集合框架中的一个重要类,是基于数组......