背包问题全解

文章目录

  • 01背包
    • 一、01背包模板
    • 二、采药
    • 三、装箱问题
    • 四、宠物小精灵之收服
    • 五、数字组合
  • 完全背包
    • 六、完全背包模板
    • 七、买书
    • 八、货币系统(简单版)
    • 九、货币系统(进阶版)

01背包

一、01背包模板

在这里插入图片描述
在这里插入图片描述

还有个疑惑,为什么最大价值一定是背包装满的时候?
因为你背包装满的情况囊括了前面不装满的情况

#include<iostream>
#include<algorithm>
using namespace std;

const int N = 1010;
int f[N];
int n,m;
int v[N],w[N];

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

二、采药

题目链接
在这里插入图片描述

这个题非常容易,套模板就行,把T当成体积,M当成物品个数

#include<iostream>
#include<algorithm>
using namespace std;

const int N = 1010, M = 110;
int w[M], f[N], v[M];
int t, m;


int main()
{
    scanf("%d%d", &t, &m);
    
    for(int i = 1;i <= m;i ++) cin >> v[i] >> w[i] ;
    
    for(int i = 1;i <= m;i ++)
        for(int j = t;j >= v[i];j --)
        f[j] = max(f[j], f[j - v[i]] + w[i]);
    
    cout << f[t];
    
    return 0;
}

三、装箱问题

题目链接
在这里插入图片描述

这个题目也比较容易,我们之间把体积当成价值就行

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 20010;
int f[N], v[N];
int n, V;

int main()
{
    cin >> V >> n;
    for(int i = 1;i <= n;i ++)
    cin >> v[i];
    //箱子的空间就是价值
    for(int i = 1;i <= n;i ++)
        for(int j = V;j >= v[i];j --)
        f[j] = max(f[j], f[j - v[i]] + v[i]);
        
    cout << V - f[V];
    
    return 0;
}

四、宠物小精灵之收服

题目链接
在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1010, M = 510;
int f[N][M];
int V1[N], V2[M];
int n, m, k;

int main()
{
    cin >> n >> m >> k;
    for(int i = 1;i <= k;i ++) cin >> V1[i] >> V2[i];
    
    for(int i = 1;i <= k;i ++)
        for(int v1 = n;v1 >= V1[i];v1 --)
        {
            for(int v2 = m - 1;v2 >= V2[i];v2 --)
            f[v1][v2] = max(f[v1][v2], f[v1 - V1[i]][v2 - V2[i]] + 1);
        }
    
    cout << f[n][m - 1] << ' ';
    
    int t = m - 1;
    while(t > 0 && f[n][t - 1] == f[n][t]) t --;
    cout << m - t;
    return 0;
}

五、数字组合

题目链接
在这里插入图片描述

这个题的难点在于初始化,你要求总和为M的方案数,而不是像上面的题目一样求从哪个状态过渡来的最大方案数,所以当你和为0的时候,你就要初始化此时方案数为1,因为你此时什么都不选也是一种方案

在这里插入图片描述

#include<iostream>
#include<algorithm>
using namespace std;
int n, m;
const int N = 10010;
int v[N];
int f[N];

int main()
{
    cin >> n >> m;
    for(int i = 1;i <= n;i ++) cin >> v[i];
    
    f[0] = 1;
    
    for(int i = 1;i <= n;i ++)
    for(int j = m;j >= v[i];j --)
    f[j] += f[j - v[i]];//加上你从每个方案过渡来的情况

    
    cout << f[m];
    return 0;
}

完全背包

六、完全背包模板

题目链接
在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1010;
int f[N];
int v[N],w[N];
int n,m;

int main()
{
    cin >> n >> m;
    for(int i = 1;i <= n;i ++) cin >> v[i] >> w[i];
    
    for(int i = 1;i <= n;i ++)
        for(int j = v[i];j <= m;j ++)
        f[j] = max(f[j], f[j - v[i]] + w[i]);
    cout << f[m];
}

七、买书

在这里插入图片描述

这个题也非常简单,就是套模板

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1010;
int n;
int a[5] = { 0,10,20,50,100};
int f[N];

int main()
{
    cin >> n;
    f[0] = 1;
    for(int i = 1;i <= 4;i ++)
    {
        for(int j = a[i];j <= n;j ++)
        f[j] += f[j - a[i]];
    }
    cout << f[n];
    return 0;
}

八、货币系统(简单版)

题目链接
在这里插入图片描述

这里有一个坑,会int会暴栈
其他都是搓模板

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 20, M = 3010;
typedef long long LL;
LL f[M];
int v[N];
int n,m;

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

九、货币系统(进阶版)

题目链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 110, M = 25100;

int a[N],f[M];
int n;
int main()
{
    int t;
    cin >> t;
    while(t --)
    {
        cin >> n;
        for(int i = 0;i < n;i ++) cin >> a[i];
        
        memset(f, 0, sizeof f);
        f[0] = 1;//初始化当要表示0的和时候,0本身不能被丢掉,所以为真,被丢掉的元素为假
        sort(a, a + n);//先排序找最大的元素,以这个元素为“标准体积”
        int k = 0;
        int m = a[n - 1];
        
        for(int i = 0;i < n;i ++)
        {
            if(!f[a[i]]) k ++;//第一个数一定不能被表示出来
            for(int j = a[i];j <= m;j ++)
            f[j] |= f[j - a[i]];//一旦j这个和能够被前面的数表示出来,那么这个元素可以丢掉
        }
        cout << k << endl;
    }
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【高阶数据结构】红黑树的插入(超多精美图解+完整代码)

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《高阶数据结构》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多《高阶数据结构》点击专栏链接查看&a…

51单片机应用开发(进阶)---外部中断(按键+数码管显示0-F)

实现目标 1、巩固数码管、外部中断知识 2、具体实现&#xff1a;按键K4&#xff08;INT1&#xff09;每按一次&#xff0c;数码管从0依次递增显示至F&#xff0c;再按则循环显示。 一、共阳数码管 1.1 共阳数码管结构 1.2 共阳数码管码表 共阳不带小数点0-F段码为&#xff…

MacOS上Homebrew 安装、配置、更改国内镜像源及使用教程

Homebrew笔记 1. 介绍 官网&#xff1a;https://brew.sh/ 对于习惯了使用命令来完成一切的程序员来说&#xff0c;安装软件这种小事&#xff0c;自然是能够用命令解决&#xff0c;就不用图形界面选择。但是在 Linux 中&#xff0c;我们有 yum、apt、dnf、pkg等命令来完成软件的…

LeetCode 热题 100之链表1

1.相交链表 思路分析&#xff08;直接上双指针&#xff09;&#xff1a; 初始化两个指针&#xff0c;分别指向两个链表的头节点 headA 和 headB遍历两个链表&#xff0c;当指针到达链表的末尾时&#xff0c;将指针移动到另一个链表的头部 如果链表相交&#xff0c;两个指针会在…

【含开题报告+文档+PPT+源码】基于SSM的旅游与自然保护平台开发与实现

开题报告 围场县拥有丰富的自然景观和野生动植物资源&#xff0c;同时面临着旅游业发展和自然保护之间的平衡问题&#xff0c;通过强调自然保护&#xff0c;这个平台可以教育游客如何尊重和保护当地的生态环境。同时&#xff0c;平台还可以提供关于生态保护的信息&#xff0c;…

立仪光谱共焦在玻璃上奥秘与应用

在现代工业和科学研究中&#xff0c;玻璃因其透明、坚硬和易加工的特性被广泛应用于各个领域。然而&#xff0c;玻璃的厚度测量一直是困扰业界的一大难题。传统的千分尺或电容式传感器虽然在一定程度上能满足生产需求&#xff0c;但在精度、效率以及适用范围上存在明显的局限。…

中航资本:市盈率静和动分别是什么意思?市盈率静和动看哪个准?

市盈率静和动别离是什么意思&#xff1f; 市盈率静就是指静态市盈率&#xff0c;是以最新一期的年报为核算根据&#xff0c;其数据核算公式为&#xff1a;总市值最新一期的年报的净利润&#xff0c;年报的净利润可所以作用快报或作用预告发布的数据。 市盈率动就是动态市盈率…

动态规划 - 背包问题 - 完全背包

完全背包物品数量无限制&#xff0c;可以使用多次的实现方式&#xff1a;背包正序遍历 0-1背包&#xff1a;先物品后背包&#xff0c;物品正序、背包倒序&#xff08;保证每个物品只用一次&#xff09; 完全背包&#xff1a;先后顺序都可以&#xff0c;物品正序、背包正序 如果…

基于卷积神经网络的苹果病害识别与防治系统,resnet50,mobilenet模型【pytorch框架+python源码】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示&#xff1a; 苹果病害识别与防治系统&#xff0c;卷积神经网络&#xff0c;resnet50&#xff0c;mobilenet【pytorch框架&#xff0c;python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于卷积…

appium+mumu模拟器 嚼碎菜鸟教程

1、android sdk 下载安装 下载地址&#xff1a;https://www.androiddevtools.cn/index.html# 选择版本&#xff1a;android sdk【sdk tools:installer_r24.4.1-windows.exe】 参考步骤&#xff1a;https://blog.csdn.net/2401_83004375/article/details/139300339 2、jdk 安装…

day11:磁盘管理

一&#xff0c;磁盘概述 磁盘概述 磁盘是一种持久性存储设备&#xff0c;用于存储操作系统、应用程序和数据。磁盘通常分为**机械硬盘&#xff08;HDD&#xff09;和固态硬盘&#xff08;SSD&#xff09;**两种&#xff0c;HDD 基于旋转的磁性盘片&#xff0c;而 SSD 基于闪存…

【WRF数据处理】基于GIS4WRF插件将geotiff数据转为tiff(geogrid,WPS所需数据)

【WRF数据处理】基于GIS4WRF插件将geotiff数据转为tiff&#xff08;geogrid&#xff0c;WPS所需数据&#xff09; 数据准备&#xff1a;以叶面积指数LAI为例QGis实操&#xff1a;基于GIS4WRF插件将geotiff数据转为tiff警告&#xff1a;GIS4WRF: Input layer had an unexpected …

ES8JC-ASEMI超快恢复二极管ES8JC

编辑&#xff1a;ll ES8JC-ASEMI超快恢复二极管ES8JC 型号&#xff1a;ES8JC 品牌&#xff1a;ASEMI 封装&#xff1a;SMC 安装方式&#xff1a;贴片 批号&#xff1a;最新 恢复时间&#xff1a;35ns 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;8A 最大循…

ECCV 2024论文分享┆Agent Attention: Softmax注意力和线性注意力的高效融合

简介 本推文主要介绍了由清华大学黄高老师团队发表在ECCV 2024上的一篇论文《Agent Attention: On the Integration of Softmax and Linear Attention》&#xff0c;文中提出了一种新型的代理注意力&#xff08;Agent Attention&#xff09;。近年来&#xff0c;Transformer在…

Github 2024-10-29Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-10-29统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10TypeScript项目1gpt4free存储库:强大语言模型的集合 创建周期:300 天开发语言:Python协议类型:GNU General Public License v3…

【Java】逻辑控制 —— 三大结构 和 猜数字游戏

目录 1. 顺序结构 2. 分支结构【与C略有不同】 2.1 if语句 2.2 switch语句 注意事项【与C不同】 3. 循环结构【与C略有不同】 3.1 while循环 * break和continue 3.2 for循环 3.3 do while循环 * 输入的判断&#xff08;hasNext&#xff09; 4. 猜数字游戏 1. 顺序结…

大文件秒传,分片上传,断点续传

大文件分片上传 一 功能描述 1.文件通过web端分片多线程上传到服务端&#xff0c;然后web端发起分片合并&#xff0c;完成大文件分片上传功能 2.上传过的大文件&#xff0c;实现秒传 3.上传过程中&#xff0c;服务异常退出&#xff0c;实现断点续传 二 流程图 三 代码运行…

【含开题报告+文档+PPT+源码】基于Java的社会公益平台

开题报告 随着社会的不断进步和人们公益意识的日益增强&#xff0c;社会公益事业在全球范围内得到了广泛的关注和参与。然而&#xff0c;传统的公益模式往往受到信息不对称、资源分散、管理效率低下等问题的困扰&#xff0c;导致公益活动的效果有限&#xff0c;难以满足社会的…

【C语言】C语言入门--函数

文章目录 前言一、函数的概念一、pandas是什么&#xff1f;二、库函数 1.标准库和头文件2.库函数的使用方法3.库函数文档的一般格式三、自定义函数四、形参和实参五、return语句六、数组做函数参数七、嵌套调用和链式访问 1.嵌套调用2.链式访问八、函数的声明和定义 1.单个文件…

C++在实际项目中的应用第二节:C++与区块链

第五章&#xff1a;C在实际项目中的应用 第二课&#xff1a;C与区块链 区块链技术因其去中心化、不可篡改和透明性而受到广泛关注。在这门课程中&#xff0c;我们将深入探讨区块链的基本原理、智能合约的开发以及实际应用的案例分析&#xff0c;重点使用 C 作为实现语言&…