day 44 完全背包

完全背包
有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。

完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。

  1. 递推公式及顺序
    01背包: dp[ i ][ j ] = max (dp[ i -1][ j - w[ i ] ] + v[ i ], dp[ i - 1 ][ j ])
    完全背包:dp[ i ][ j ] = max (dp[ i ][ j - w[ i ] ] + v[ i ], dp[ i - 1 ][ j ])

区别:
01背包,不可以重复放入物品,所以在决定放入新物品时,需要用到 前 i-1种物品的数值,放到一维数组中,就是当前位置前面那个数字,也就是旧数据。所以需要逆序遍历才能保持前方旧数据保持不变
完全背包可以重复放,决定放入第 i 种物品时,这个物品在之前可能已经放进去了,需要用到的是 前 i 种物品的数值。 对应到一维数组,就是当前位置不断更新的值,也就是新数据,所以是正序

  1. for 循环嵌套的顺序-----无所谓
    先背包,再物品, 物品每次都是从头遍历,实现了重复放
    先物品,再背包, 背包容量变大,物品就可以放进去多个

在这里插入图片描述
完全背包解种类问题
如果求组合数就是外层for循环遍历物品,内层for遍历背包。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。

518. 零钱兑换 II

题目:
给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0。假设每一种面额的硬币有无限个。

分析:
(1) 可重复使用
(2)不强调顺序 2 2 1 == 1 2 2
(3)组合数 for循环遍历物品,内层for遍历背包。
同一个物品,先被反复的放, 再进行下一个物品,所以是没有顺序的组合数

  1. dp[ j ] 凑成总金额j的货币组合数为dp[j]
  2. 递推公式 dp[ j ] += d[ j - coins[ i ]]
    dp[j],j 为5,已经有一个1(nums[i]) 的话,有 dp[4]种方法 凑成 容量为5的背包。
  3. 初始化 dp[ 0 ] = 1;
  4. 递推顺序正序
class Solution {
public:int change(int amount, vector<int>& coins) {vector<int>dp(amount+1, 0); // dp[i] 凑成金额i有多少种情况dp[0] = 1;for(int i=0; i<coins.size(); i++){for(int j=1; j<=amount; j++){if(j>=coins[i]){dp[j] += dp[j-coins[i]]; }}}return dp[amount];}
};

377. 组合总和 Ⅳ
题目: 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。

  1. 回溯
    不同数字 —>不需要同层去重
    可反复取用 —> 从当前开始
    排列个数----> for循环从0开始 cur += dfs(candidates, target-candidates[i]);
    防止超时----> 记忆化搜索---->剪枝
class Solution {
public:unordered_map<int, int>mp;int combinationSum4(vector<int>& nums, int target) {sort(nums.begin(), nums.end());int sum = dfs(nums, target);return sum;}int dfs(vector<int>& candidates, int target){if(mp.find(target)!=mp.end()){return mp[target];} //记忆化搜索if(target == 0){mp[target] = 1;return 1;}int cur = 0;for(int i=0; i<candidates.size(); i++){   // 可重复选用if(target - candidates[i] < 0) break;cur += dfs(candidates, target-candidates[i]); //问种类数}mp[target] = cur;return mp[target];}
};
  1. 完全背包
    不同数字 —>不同物品
    可反复取用 —> 完全背包
    排列----> 外层for遍历背包,内层for循环遍历物品
    同一个位置放入不同的物品, 下一个位置也允许放入之前放过的物品,那么之间是有顺序的 1 1 2 1 1 2 是排列数

注意: if(j>=nums[i] && dp[j] < INT_MAX - dp[j-nums[i]]) 防止两个数相加爆int

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/19039.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Yjmstr的算法竞赛模板(updating)

YJMSTR的算法竞赛模板 目录 文章目录 YJMSTR的算法竞赛模板目录图论一、最短路1.spfa与负环、最短路1.1 bfs-spfa找负环&#xff1a;1.2 dfs-spfa找负环1.3 spfa求最短路的优化 2.dijkstra模板&#xff08;set模拟二叉堆堆优化)2.1有向图最小环 3.Floyd求多源最短路/传递闭包/…

DataGrip连接clickhouse数据库后,左侧不显示库中的表

一、问题描述 使用datagrip链接clickhouse&#xff0c;本来左侧时可以显示数据库中对应的表的列表的。但是&#xff0c;这个链接clickhouse不显示。 二、问题解决 参考一些文档后&#xff0c;而且因为当前采用的时2023.1.2的版本&#xff0c;所以&#xff0c;选项有些改变。…

Java的运算符

运算符介绍 运算符是一种特殊的符号&#xff0c;用以表示数据的运算、赋值和比较等。 运算符介绍 算术运算符赋值运算符关系运算符 [比较运算符]逻辑运算符位运算符 [需要二进制基础]三元运算符 算术运算符 介绍 算术运算符是对数值类型的变量进行运算的&#xff0c;在 Ja…

交流充电桩配件功能详述

汽车充电桩常见的配件包括充电枪、充电控制器、计量表、触摸屏、安全指示灯、电能计费器、读卡器、紧急按钮、充电桩外壳、线缆等构成&#xff0c;下面沐渥小编给大家详述交流充电桩各配件的主要功能。 1.充电枪&#xff1a;是连接充电桩和电动汽车的关键配件&#xff0c;通过充…

策略的介绍

目录 ACL——访问控制列表 ACL访问控制列表的匹配原则——自上而下&#xff0c;逐一匹配&#xff0c;一旦匹配上则不再向下匹配 ACL的分类 ACL的调用 ACL——访问控制列表 配置了ACL的网络设备根据事先制定好的规则&#xff0c;然后对经过该设备的流量按照对应的规则进行匹…

Spring -- Bean的生命周期

BeanDefinition Spring容器在进行实例化时&#xff0c;会将xml配置的<bean>的信息封装成一个BeanDefinition对象&#xff0c;Spring根据BeanDefinition来创建Bean对象&#xff0c;里面有很多的属性用来描述Bean BeanDefinition 中几个重要方法如下 beanClassName&#…

springcloud笔记二

配置管理服务是共有的&#xff0c;结合微服务自身的配置。这样核心配置更改就无需逐个更改 配置管理: 首先新建一个配置管理 Data ID为配置文件的名称 一般为项目名称-项目环境yaml&#xff0c;如userservice-dev.yaml 编写配置内容&#xff0c;发布 获取nacos配置信息: 可能…

【UnityDOTS 小知识】如何通过DOTS修改材质属性以及替换材质与网格

如何通过DOTS修改材质属性以及替换材质与网格 一、DOTS修改材质属性 1.利用 Material Overide Asset Material Overide Asset是一个Unity资产&#xff0c;可以通过Create创建。 创建后指定要修改的材质&#xff0c;以及对应材质的属性&#xff0c;即可完成这个资源创建。 然…

Kubernetes 入门篇上

❖ Kubernetes核心概念 ❖ 快速部署一个Kubernetes集群 ❖ Kubernetes将弃用Docker&#xff01; ❖ kubectl管理工具 ❖ Kubernetes基本资源概念 ❖ 资源编排&#xff08;YAML&#xff09; ❖ 深入理解Pod对象&#xff1a;基本管理 ❖ 深入理解Pod对象&#xff1a;调度 …

如何操作MySQL数据库基本数据

目录 一、MySQL数据库概念 数据 表&#xff08;数据表&#xff09; 数据库 数据库管理系统 数据库的建立和维护功能 数据定义功能 数据操纵功能 数据库的运行管理功能 通信功能 数据流向 二、主流数据库分类 1.SQL Server 数据库 &#xff08;微软分公司产品&…

QT分屏按钮

效果&#xff1a;按钮弹出分屏选择 // gridpopwidget.h #ifndef GRIDPOPWIDGET_H #define GRIDPOPWIDGET_H#include <QWidget> #include <QMouseEvent>class GridPopWidget : public QWidget {Q_OBJECT public:explicit GridPopWidget(QWidget *parent nullptr);~…

杨氏模量——从宏观(应力-应变曲线)到微观(原子键)尺度解释杨氏模量

杨氏模量&#xff08;Young’s Modulus&#xff09;是三个主要弹性常数之一&#xff0c;与剪切模量&#xff08;shear modulus&#xff09;、体积模量&#xff08;bulk modulus&#xff09;一起用于描述材料在载荷下如何变形 以下展示了拉伸试验的应力应变曲线 如果施加的应力…