完全背包+背包装满 总结

2024-05-27 23:04
文章标签 总结 背包 完全 装满

本文主要是介绍完全背包+背包装满 总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.背包恰好装满

(1)问题是什么

(2)问题的有效状态和无效状态

(3)问题的常考形式,以及如何去处理

1.值的大小

2.组合个数

3.排列个数

2.例题

A. Cut Ribbon

HDU1114 Piggy-Bank 


1.背包恰好装满

(1)问题是什么

背包恰好装满的最大价值可以拆分成两个子问题

1.背包能否背恰好装满

2.如果可以恰好装满,那么恰好装满的时候的最大价值为多少

(2)问题的有效状态和无效状态

对于这种问题,背包的有效状态指的是背包为空,或者是背包恰好装满

无效状态指的是背包装了东西,但是没有装满

!!!!!!!!结论:任何有效状态都是由有效状态推出来的,无效状态无法推出有效状态 

(3)问题的常考形式,以及如何去处理

1.值的大小

2.组合个数

3.排列个数

首先我们在这篇博客主要讨论的是值的大小,一般会有两种考向:

一个是容量为j的背包,最多能装多少物品

一个是容量为j的背包,最少能装多少物品 

(1)对于第一个来说

既然其有效状态是为了求最大值,我们就要将无效状态的值变为一个最小值,这样完全背包的代码,无效值就无法去影响有效值的计算了

(2)对于第二个来说

和第一个相反,将无效状态变为一个最大值,别的没有任何区别 

2.例题

A. Cut Ribbon

 

CF上一个div2的A题,那么必然就是一个简单的模版题了, 就是完全背包+判断背包装满是的最大的丝带数,然后就要用到我们的第一种情况了,让无效状态的值是一个int类型的最小值,然后正常去进行完全背包就可以直接拿下了

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int a[5];
int dp[4005];signed main()
{cin>>n;for(int i=1;i<=3;i++){cin>>a[i];}memset(dp,-0x3f3f3f3f,sizeof(dp));//既然他想求最大值,那么我们就将非法状态设置为int类型的负无穷dp[0]=0;//长度为0,那肯定最大缎带数量为0;for(int i=1;i<=3;i++){for(int j=a[i];j<=n;j++){dp[j]=max(dp[j],dp[j-a[i]]+1);}}printf("%lld",dp[n]);return 0;
}

HDU1114 Piggy-Bank 

 

这个就相当于一个给我一个容量为f-e的背包,去判断这么个背包装满的时候,最少能装多少价值的物品,第二种情况,将无效状态设为int类型的最大值即可(我这边设置的是long long 类型的最大值,反正都是一个效果)

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define int long long
int t;
int e,f;
int n;
int w[505];
int p[505];
int dp[10005];//表示的是j公斤,所得到的最小价值为dp[j]
//因为要求最小金额,那么我们一上来给dp初始化为int最大值 
signed main() 
{cin>>t;while(t--){cin>>e>>f;cin>>n;for(int i=1;i<=n;i++){cin>>p[i]>>w[i];}memset(dp,0x3f3f3f3f3f3f3f3f,sizeof(dp));dp[0]=0;for(int i=1;i<=n;i++){for(int j=w[i];j<=f-e;j++){dp[j]=min(dp[j],dp[j-w[i]]+p[i]);}}if(dp[f-e]!=0x3f3f3f3f3f3f3f3f){printf("The minimum amount of money in the piggy-bank is %lld.\n",dp[f-e]);}if(dp[f-e]==0x3f3f3f3f3f3f3f3f)printf("This is impossible.");}return 0;
}

这篇关于完全背包+背包装满 总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1008842

相关文章

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用