dp算法篇Day11

news2024/11/28 12:49:51

 “哎呀,哎呀,流云开一朵,哟诶嘿哟,哟诶嘿哟~”


51、目标和

(1) 题目解析

        包括之后的一些题目,乍一眼看可能你不会发现它与dp问题有何相连,可是按照按照题目又难以想出 思路、写出代码来。因此,解决这一类问题的关键,现在倒不是状态表示或状态转移方程,而是如何将题目的思路进行转化。

(2) 算法原理

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int target) {
        int sum = 0;
        for(auto& e:nums) sum += e;
        int aim = (sum + target) / 2;
        // 处理边界 
        // aim是所有正数的和 sum + target只有是偶数时才能分两个
        if(aim < 0 || (sum + target) % 2) return 0;
        
        int n = nums.size();
        vector<vector<int>> dp(n+1,vector<int>(aim+1));
        dp[0][0] = 1;
        for(int i=1;i<=n;++i)    
            // 注:这里因为第一列没有必要做初始化 所以从0开始
            for(int j=0;j<=aim;++j)
            {
                dp[i][j] = dp[i-1][j];
                if(j >= nums[i-1]) dp[i][j] += dp[i-1][j-nums[i-1]];
            }

        return dp[n][aim];
    }
};

优化:

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int target) {
        int sum = 0;
        for(auto& e:nums) sum += e;
        int aim = (sum + target) / 2;
        // 处理边界 
        // aim是所有正数的和 sum + target只有是偶数时才能分两个
        if(aim < 0 || (sum + target) % 2) return 0;
        
        int n = nums.size();
        vector<int> dp(aim+1);
        dp[0] = 1;
        for(int i=1;i<=n;++i)
            for(int j=aim;j >= nums[i-1];--j)
            {
                if(j >= nums[i-1]) dp[j] += dp[j-nums[i-1]];
            }

        return dp[aim];
    }
};


52、最后一块石头的重量

(1) 题目解析      

        读完题目,以及即便看懂了题目举的例子,恐怕你的脑子里也很难立马生成如何解决这个问题的思路。这同样是一道类似"背包问题"的题目,关键就在于如何讲题目信息,求解内容进行转化。    

  

(2) 算法原理      

 

class Solution {
public:
    int lastStoneWeightII(vector<int>& stones) {
        int sum = 0;
        for(auto& e:stones) sum += e;
        int aim = sum / 2;

        int n =stones.size();
        vector<vector<int>> dp(n+1,vector<int>(aim+1));
        for(int i=1;i<=n;++i)
            for(int j=0;j<=aim;++j)
            {
                dp[i][j] = dp[i-1][j];
                if(j >= stones[i-1]) dp[i][j] = max(dp[i][j],dp[i-1][j-stones[i-1]] + stones[i-1]); 
            }
        return sum - (dp[n][aim])*2;
    }
};

优化:

class Solution {
public:
    int lastStoneWeightII(vector<int>& stones) {
        int sum = 0;
        for(auto& e:stones) sum += e;
        int aim = sum / 2;

        int n =stones.size();
        vector<int> dp(aim+1);
        for(int i=1;i<=n;++i)
            for(int j=aim;j >= stones[i-1];--j)
            {
                dp[j] = max(dp[j],dp[j-stones[i-1]] + stones[i-1]); 
            }
        return sum - (dp[aim])*2;
    }
};


53、完全背包

(1) 题目解析

         在之前介绍背包问题时,也谈到过完全背包是怎么回事,其实就是一个物品的数量可以有多个,也就是可以被选择多次。这同拿到背包问题一样,是一道模板题型。其中的分析思路,可以适用很多可以转化为背包场景的问题中。

(2) 算法原理

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int N = 1024;
int dp[N][N];
// 体积+价值
int V[N],W[N];
int n,v;

int main() 
{
    cin >> n >> v;
    // 录入数据
    for(int i=1;i<=n;++i)
        cin >> V[i] >> W[i];
        
    for(int j=0;j<=v;++j) dp[0][j] = 0;
    for(int i=1;i<=n;++i)
        for(int j=0;j<=v;++j)
        {
            dp[i][j] = dp[i-1][j];
            if(j >= V[i]) dp[i][j] = max(dp[i][j],dp[i][j-V[i]] + W[i]);
        }
    cout << dp[n][v] << endl;

    memset(dp,0,sizeof(dp));
    // 初始化
    for(int j=1;j<=v;++j) dp[0][j] = -1;

    for(int i=1;i<=n;++i)
        for(int j=0;j<=v;++j)
        {
            dp[i][j] = dp[i-1][j];
            // 边界
            if(j >= V[i] && dp[i][j-V[i]] != -1) 
                dp[i][j] = max(dp[i][j],dp[i][j-V[i]] + W[i]);
        }
    cout << (dp[n][v] == -1 ? 0 : dp[n][v]) << endl;    
}

 

优化:

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int N = 1024;
// 体积+价值
int V[N],W[N];
int n,v;

int main() 
{
    cin >> n >> v;
    // 录入数据
    for(int i=1;i<=n;++i)
        cin >> V[i] >> W[i];

    int dp[v];
    for(int j=0;j<=v;++j) dp[j] = 0;

    for(int i=1;i<=n;++i)
        for(int j=V[i];j<=v;++j) // 从左到右
        {
            dp[j] = max(dp[j],dp[j-V[i]] + W[i]);
        }
    cout << dp[v] << endl;

    memset(dp,0,sizeof(dp));
    // 初始化
    for(int j=1;j<=v;++j) dp[j] = -0x3f3f3f3f;

    for(int i=1;i<=n;++i)
        for(int j=V[i];j<=v;++j)
        {
            // 边界dp[j-V[i]] + W[i]当不存在是 是一个很小的数
            dp[j] = max(dp[j],dp[j-V[i]] + W[i]);
        }
    cout << (dp[v] < 0 ? 0 : dp[v]) << endl;    
}


54、零钱兑换

(1) 题目解析

 

        其实很多时候,遇到这种选与不选的题型,你就应该往背包问题上思考。

(2) 算法原理 

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        int n = coins.size();
        int INT_INFO = 0x3f3f3f3f;

        // 初始化
        vector<int> dp(amount+1,INT_INFO);
        dp[0] = 0;
        
        for(int i=1;i<=n;++i)   
            for(int j=coins[i-1];j<=amount;++j)
                dp[j] = min(dp[j],dp[j-coins[i-1]] + 1);
        
        return dp[amount] >= INT_INFO ? -1 : dp[amount];
    }
};


 

55、零钱兑换Ⅱ 

(1) 题目解析

        从题目看,也知道这道题肯定和上一道题有着密切的关系。是的!这道题也是一道可以被转换成"完全背包"的题型。相反,上一道题是求的能填满背包的最少物品,这次是求的是填满背包有多少种方法。

(2) 算法原理              

class Solution {
public:
    int change(int amount, vector<int>& coins) {
        int n = coins.size();

        vector<int> dp(amount+1);
        dp[0] = 1;

        for(int i=1;i<=n;++i)
            for(int j=coins[i-1];j<=amount;++j) // 从左往右   
            {
                dp[j] += dp[j-coins[i-1]];
            } 

        return dp[amount];
    }
};

本篇到此结束,感谢你的阅读。

祝你好运,向阳而生~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PostgreSQL——编码“GBK“的字符0x0xa8 0x27在编码“UTF8“没有相对应值`

问题&#xff1a;编码"GBK"的字符0x0xa8 0x27在编码"UTF8"没有相对应值 原因&#xff1a;客户端编码与服务端编码不一致 select name,setting,context from pg_settings where name like %encoding%; 解决方案&#xff1a;修改客户端编码方式和服务端一致…

Jmeter接口测试工具的一些使用小技巧

如何使用英文界面的JMeter Jmeter启动时会自动判断操作系统的locale 并选择合适的语言启动&#xff0c;所以&#xff0c;我们启动jmeter后&#xff0c;其会出现一个倍感亲切的中文界面。但由于jmeter本身的汉化工作做得不好&#xff0c;你会看到有未被汉化的选项及元件的参数。…

脸书营销,跨境电商不能忽视的营销新趋势

Facebook营销就是在Facebook上通过有针对性的广告、商业品牌群组等地方推广您的业务。随着社交媒体继续成为我们日常生活中不可或缺的一部分&#xff0c;Facebook产品在社交商务方面的扩展使该平台成为吸引新客户的重要渠道。 您应该注意到&#xff0c;很多企业都通过Facebook…

3个能免费使用的AI绘画软件,效果精致

通过AI绘画软件&#xff0c;设计小白也能轻松创作出精美的图画创作。本文将为大家介绍3款能免费使用的AI绘画软件&#xff0c;它们能帮助设计小白或者经验丰富的设计师快速设计出精美的图画作品&#xff0c;一起来看看吧&#xff01; 1、即时灵感 即时灵感是国产的AI绘画软件…

【复习45-51题】【每天40分钟,我们一起用50天刷完 (剑指Offer)】第三十七天 37/50

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

VRRP技术和浮动路由(第二十六课)

VRRP技术和浮动路由(第二十六课) 一、浮动路由 1、浮动路由概述 1&#xff09;浮动路由是什么 -浮动路由又称为路由备份&#xff0c;由两条或多条链路组成浮动路由 -浮动路由指配置两条静态路由&#xff0c;这两条静态路由的目的地址相同&#xff0c;但是下一跳地址不同两…

CPM-Bee-5B微调实记

CPM-Bee-5B微调实记 1. 准备工作 &#xff08;1&#xff09;用PyCharm打开CPM-Bee文件夹。 &#xff08;2&#xff09;设置成自己的环境&#xff1a;nlp &#xff08;3&#xff09;将src文件夹在终端打开 &#xff08;4&#xff09;激活自己的环境&#xff1a;nlp 2. 准备…

web自动化测试进阶篇05 ——— 界面交互场景测试

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

数据结构day6(2023.7.20)

一、Xmind整理&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;个栈的入栈次序ABCDE&#xff0c;则栈的不可能的输出序列是&#xff08;D&#xff09; A.ABCDE B.DECBA C.EDCBA D.DCEAB 栈的特点是先进后出&#xff0c;后进先出&#xf…

Electron 系统通知 Notification 实践指南

系统通知是桌面应用的常见功能&#xff0c;用于给用户发送提醒&#xff08;刷下存在感 &#x1f642;&#xff09;&#xff0c;还能帮定点击事件以便后续的操作。 Electron 自带通知模块&#xff0c;下方代码是一个简单的示例 const { Notification } require(electron)cons…

Postman学习之常用断言

什么是断言&#xff1f; 断言——就是结果中的特定属性或值与预期做对比&#xff0c;如果一致&#xff0c;则用例通过&#xff0c;如果不一致&#xff0c;断言失败&#xff0c;用例失败。断言&#xff0c;是一个完整测试用例所不可或缺的一部分&#xff0c;没有断言的测试用例…

SZ:zip/内部函数外部函数/VGG模型/nn

zip&#xff1a; -r recursion-d delete-m move (move隐藏的意思是&#xff0c;原文件会消失&#xff09;想增加文件&#xff0c;不需要加参数什么参数也没有。如果zip压缩文件不存在&#xff0c;执行以上命令将会创建一个新的zip文件并将指定的文件添加进去。如果zip压缩文件…

SpringBoot+Jpa+Thymeleaf实现增删改查

SpringBootJpaThymeleaf实现增删改查 这篇文章介绍如何使用 Jpa 和 Thymeleaf 做一个增删改查的示例。 1、pom依赖 pom 包里面添加Jpa 和 Thymeleaf 的相关包引用 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.…

网络层IP协议的基本原理 数据链路层ARP协议 域名解析以及一些重要技术

目录 1 网络层IP协议协议头格式网段划分DHCPCIDR&#xff1a;基于子网掩码的划分方式特殊的IP号IP地址的数量限制私有IP地址和公网IP地址路由路由表 2 数据链路层 — 局域网的转发问题以太网认识以太网以太网帧格式局域网通信原理 MTUMTU对IP协议的影响MTU对UDP协议的影响MTU对…

重要消息:这类PEFC证书即将失效!

【重要消息&#xff1a;这类PEFC证书即将失效&#xff01;】 所有按照2013年版标准颁发的PEFC证书都将于 2023年11月14日失效。 在此之前&#xff0c;PEFC执行标准为PEFC ST 2002:2013&#xff0c;现更改为PEFC ST 2002:2020&#xff0c;即从2013年版改为2020年版。 1. 如果您的…

中国嗅觉经济产业分析

随着人们对健康和福祉的重视程度不断提升&#xff0c;嗅觉行业也开始关注个人的舒适感和情绪平衡。香氛产品、空气清新剂和芳香疗法等产品受到越来越多人的青睐&#xff0c;帮助人们创造舒适、放松和愉悦的环境。也越来越多中国消费者对香水香氛有自己独特的作用感知。我们将这…

Windows Active Directory密码同步

大多数 IT 环境中&#xff0c;员工需要记住其默认 Windows Active Directory &#xff08;AD&#xff09; 帐户以外的帐户的单独凭据&#xff0c;最重要的是&#xff0c;每个密码还受不同的密码策略和到期日期的约束&#xff0c;为不同的帐户使用单独的密码会增加用户忘记密码和…

高校在线心理咨询系统的设计与实现(论文+源码)_kaic

高校在线心理咨询系统的设计与实现 摘 要 近年来,随着社会的发展&#xff0c;大学生面临的各方面压力越来越大&#xff0c;比如学习生 活的压力、角色转换、交际困难、情感困惑、就业困难等等&#xff0c; 因对这些压力处理 不当而导致的大学生心理健康问题越来越多&#xff0…

案例解析|河道水位及水资源远程监控方案

随着国家工业的发展&#xff0c;水资源越来越紧张&#xff0c;同时对于水污染加重&#xff0c;也导致可利用水资源越发稀缺&#xff0c;因此对河道水位进行监测&#xff0c;实现水资源的远程监控就显得非常重要。 河道水位及水资源远程监控方案&#xff0c;不仅可以对河道的水…

CASAtomic原子操作详解

一、CAS&#xff08;Compare And Swap&#xff09; 1、CAS介绍 CAS原理&#xff1a;假设有三个值&#xff0c;E&#xff08;旧值&#xff09;、U&#xff08;需要更新的值&#xff09;、V&#xff08;内存中真实的值&#xff09;&#xff0c;具体参照下图&#xff1a; 作用&a…