完全背包+背包装满 总结

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

相关文章

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

csu(背包的变形题)

题目链接 这是一道背包的变形题目。好题呀 题意:给n个怪物,m个人,每个人的魔法消耗和魔法伤害不同,求打死所有怪物所需的魔法 #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>//#include<u>#include<map