当前位置: 首页 > news >正文

代码随想录三十七天 完全背包二维 完全背包一维 518. 零钱兑换 II 377. 组合总和 Ⅳ

完全背包二维

初始化和dp方程变化了。

#include <iostream>
#include <vector>
using namespace std;int main() {int n, bagWeight;int w, v;cin >> n >> bagWeight;vector<int> weight(n);vector<int> value(n);for (int i = 0; i < n; i++) {cin >> weight[i] >> value[i];}vector<vector<int>> dp(n, vector<int>(bagWeight + 1, 0));// 初始化for (int j = weight[0]; j <= bagWeight; j++)dp[0][j] = dp[0][j - weight[0]] + value[0];for (int i = 1; i < n; i++) { // 遍历物品for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量if (j < weight[i]) dp[i][j] = dp[i - 1][j];else dp[i][j] = max(dp[i - 1][j], dp[i][j - weight[i]] + value[i]);}}cout << dp[n - 1][bagWeight] << endl;return 0;
}

完全背包一维

1. 首先和 01背包的dp方程不一样了

2. 其次,这里的遍历顺序要是正的。如图所示,要使用的上一行的元素在自己的右边,倒着遍历就覆盖了。

#include <iostream>
#include <vector>
using namespace std;int main() {int N, bagWeight;cin >> N >> bagWeight;vector<int> weight(N, 0);vector<int> value(N, 0);for (int i = 0; i < N; i++) {int w;int v;cin >> w >> v;weight[i] = w;value[i] = v;}vector<int> dp(bagWeight + 1, 0);for(int i = 0; i < weight.size(); i++) { // 遍历物品for(int j = weight[i]; j <= bagWeight; j++) { // 遍历背包容量dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);}
}cout << dp[bagWeight] << endl;return 0;
}

518. 零钱兑换 II

完全背包的简单应用,是组合数。

写方法数的时候有的时候会忘记初始化dp[0]=1,用一维数组写的时候,想一下第一排的内容。

func change(amount int, coins []int) int {//完全背包  求方法数  正序遍历//一维版本dp:=make([]int,amount+1) //初始化 写之前想一下第一排是什么内容dp[0]=1  //方法数这里就是1  //初始化for i:=0;i<len(coins);i++{for j:=coins[i];j<=amount;j++{dp[j]=dp[j]+dp[j-coins[i]]}}return dp[amount]}

377. 组合总和 Ⅳ

这题代码用代码随想录上的一维遍历的方式太不好理解了,用爬楼梯 比较好理解,也不难写

func combinationSum4(nums []int, target int) int {//代码随想录那个不好理解//爬楼梯的方式好理解。这个是Leetcode70的进阶版本。//原先爬楼梯,一次只能爬1格或者是2格。f[n]=f[n-1]+f[n-2]。相当于nums=[1,2]//这题是爬楼梯,一次能爬1格,2格,3格dp:=make([]int,target+1) //dp表示爬到某格有多少种方法dp[0]=1  //初始化,爬0格有一种方法,什么都不做for i:=1;i<=target;i++{for _,num:=range nums{if i>=num {dp[i]+=dp[i-num]}}}return dp[target]
}
/*
直观的操作过程
dp[0] = 1 (初始化)dp[1] = dp[0] ① → 1dp[2] = dp[1] + dp[0] → 1 + 1 = 2dp[3] = dp[2] + dp[1] + dp[0] → 2 + 1 + 1 = 4dp[4] = dp[3] + dp[2] + dp[1] → 4 + 2 + 1 = 7
*/

http://www.xdnf.cn/news/430309.html

相关文章:

  • 视频编解码学习十一之视频原始数据
  • 思维链实现 方式解析
  • Python----神经网络(《Inverted Residuals and Linear Bottlenecks》论文概括和MobileNetV2网络)
  • 简单介绍Qt的属性子系统
  • Python爬虫(26)Python爬虫高阶:Scrapy+Selenium分布式动态爬虫架构实践
  • MLA (Multi-head Attention Layer) 详细说明
  • 报告研读:125页2024年大模型轻量化技术研究报告——技术详细讲解【附全文阅读】
  • 9、Activiti-任务(Task)的相关操作
  • 深入浅出MySQL 8.0:新特性与最佳实践
  • java基础-方法的重写、super关键字
  • NVMe学习资料汇总
  • 浅析AI大模型为何需要向量数据库?从记忆存储到认知进化
  • AI Agent开发第65课-DIFY和企业现有系统结合实现高可配置的智能零售AI Agent(下)
  • 2025年,大模型LLM还有哪些可研究的方向?
  • Mac上安装Mysql的详细步骤及配置
  • Python核心数据类型全解析:字符串、列表、元组、字典与集合
  • 在C#中使用YOLO的几种方式
  • 代码仓提交分支规范
  • docker安装mysql8, 字符集,SQL大小写规范,sql_mode
  • G1JVM内存分配机制详解
  • 华秋2025电子设计与制造技术研讨会(华东站)成功举办!
  • 合合信息上线智能文档处理领域首批MCP服务,助力企业快速搭建Agent
  • paimon中批和流查看过去的快照的数据及变动的数据
  • #S4U2SELF#S4U2Proxy#CVE-2021-42278/42287以及手动复现
  • 脑机接口技术:开启人类与机器融合的新时代
  • 《从像素到身份:Flutter如何打通社交应用人脸识别的技术闭环》
  • 本地缓存的三种实现
  • 检索增强生成(RAG)简介
  • Codeforces Round 998 (Div. 3)
  • STM32F103_LL库+寄存器学习笔记22 - 基础定时器TIM实现1ms周期回调