首页 > 其他分享 >背包问题

背包问题

时间:2023-12-03 15:23:41浏览次数:23  
标签:背包 int memset 骨头 问题 sizeof include

先聊聊区分 贪心01背包

背包问题:

有多个物品,重量不同、价值不同,以及一个容量有限的背包,选择一些物品装到背包中,问怎么裝才能使装进背包的物品总价值最大。根据不同的限定条件,可以把背包问题分为很多种,常见的有下面两种:

(1)如果每个物体可以切分。称为一般背包问题,用贪心法求最优解。比如吃自助餐,在饭量一定的情况下,怎么吃才能使吃到肚子里的最值钱?显然应该从最贵的食物吃起,吃完了最贵的再吃第2贵的,这就是贪心法

(2) 如果每个物体不可分割,称为 0/1 背包问题。仍以吃自助餐为例,这次食物都是一份份的,每一份必须吃完。如果最贵的食物一份就超过了你的饭量,那只好放弃。这种问题无法用贪心法求最优解。

01背包问题

01背包是一种动态规划问题。动态规划的核心就是状态转移方程,解释01背包状态转移方程的原理。

01背包问题可描述为如下问题:

有一个容量为V的背包,还有n个物体。现在忽略物体实际几何形状,我们认为只要背包的剩余容量大于等于物体体积,那就可以装进背包里。每个物体都有两个属性,即体积w和价值v。

问:如何向背包装物体才能使背包中物体的总价值最大?

img

例题:骨头收集器

问题描述

许多年前,在泰迪的家乡,有一个人叫“骨头收集者”。这个人喜欢收集各种骨头,比如狗的、牛的,他也去坟墓......
骨头采集者有一个体积为V的大袋子,在他收集的旅途中有很多骨头,显然,不同的骨头有不同的价值和不同的体积,现在给定每块骨头沿途的价值,你能计算出骨头收集者可以得到的总价值的最大值吗?
img

输入

第一行包含一个整数 T ,即案例数。
后面是T个案例,每个案例三行,第一行包含两个整数N,V,(N <= 1000,V <= 1000)代表骨头的数量和他的袋子的体积。第二行包含 N 个整数,表示每个骨骼的值。第三行包含 N 个整数,表示每块骨头的体积。

输出

每行一个整数,表示总值的最大值(此数字将小于 231)。

示例输入

1
5 10
1 2 3 4 5
5 4 3 2 1

示例输出

14

原题链接:Problem - 2602 (hdu.edu.cn)

代码(二维形式):

(二维形式)但过不了这道题!但用结构体能过!

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
//#define int long long
const int N = 1010;
int v[N], w[N];
//int f[N];
int f[N][N];
int n, m;
int x, y;
int main()
{
	int t;
	cin >> t;
	while (t--) {
		memset(f, 0, sizeof f);
		memset(v, 0, sizeof v);
		memset(w, 0, sizeof w);
		cin >> n >> m;
		for (int i = 1; i <= n; i++)
			cin >> w[i];
		for (int i = 1; i <= n; i++)
			cin >> v[i];
		
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++) {
				f[i][j] = f[i - 1][j];
				if (j >= v[i]) {
					f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);
				}
			}
		}
		cout << f[n][m] << endl;
		
	}
	return 0;
}

一维优化(滚动数组):

通过观察,二维f[][] [] [],每一行是从上面一行算出来的,只跟上面一行有关系,跟更前面的行没有关系。用新的一行覆盖原来的一行就可以了,所以可以把i层去掉

优化后,空间复杂度从O(NV)->O(V)。

缺点:覆盖了中间转移状态,只留下了最后的状态,所以损失了很多信息,导致无法输出背包的方案。

一维形式:能过!

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
//#define int long long
const int N = 1010;
int v[N], w[N];
int f[N];
int n, m;
int x, y;
int main()
{
	int t;
	cin >> t;
	while (t--) {
		memset(f, 0, sizeof f);
		memset(v, 0, sizeof v);
		memset(w, 0, sizeof w);
		cin >> n >> m;
		for (int i = 1; i <= n; i++)
			cin >> w[i];
		for (int i = 1; i <= n; i++)
			cin >> v[i];
		for (int i = 1; i <= n; i++)
			for (int j = m; j >= v[i]; j--)//倒过来
			{
                //f[i][j] = f[i - 1][j];i层去掉,恒等式了,删去
				f[j] = max(f[j], f[j - v[i]] + w[i]);
			}
		cout << f[m] << endl;
	}
	return 0;
}

标签:背包,int,memset,骨头,问题,sizeof,include
From: https://www.cnblogs.com/KAI040522/p/17873240.html

相关文章

  • nacos 命名空间设置为 001 引起的问题
    nacos版本:NACOS2.2.3nacos命名空间问题如果设置为 001 ,bootstrap.yml中的namespace也设置为001结果启动报错:[main]WARNc.b.d.d.DynamicRoutingDataSource-[afterPropertiesSet,236]-dynamic-datasourceinitialloaded[0]datasource,Pleaseaddyourprimaryd......
  • Python转C选手常见问题与注意事项
    1强制变量转换的不同含义Python的int(s)转换的是对应的数字,而C语言转换的是对应的ASCII编码,如:Python的强制变量转换s='0'a=int(s)print(a)#输出结果为0s='a'a=int(s)print(a)#程序报错C的强制变量转换s='0'a=int(s)printf("%d",a)//输出结果为48s='a'a=int(s)......
  • 如何解决Hyper-V中的虚拟机出现“无法连接到虚拟机配置存储”的问题
     上图是借用网上其它友友的图片,由于一直未在网上找到解决方案,后来无意中解决了这个问题后,把解决过程在此记录下来,方便有需要的其它友友。 先来说下我出现上述问题的背景:我的电脑有三个硬盘:Disk0,是固态硬盘,不知道历史上什么原因,2个分区的字母分得太开了。这个对于我这种有强......
  • 解决Jmeter响应报文中文乱码的问题-3种解决办法
    1.遇到问题:Jmeter在访问接口的时候,响应内容如果有中文可能会显示乱码。   2.问题分析:响应页面没有做编码处理,JMeter默认按照ISO-8859-1编码格式进行解析。   3.解决方案:办法一:通过后置处理器BeanShellPostProcessor 1)在线程组中添加后置处理器:Be......
  • 奇迹MU常见问题如何解决
    奇迹运行时最重要的就是服务器是否稳定,服务器中千万不能出现太多的问题和漏洞,想要实现这些要求就需要gm掌握一些管理服务器的技术和方法。今天要为各位讲解的是怎样防止游戏中出现开门黑屏的漏洞。无法注册ID的问题解决办法:1.先看看你的D:\mirserver\mud2\DBSrv200\FDB\和D:\mir......
  • 2302. 统计得分小于 K 的子数组数目(双指针,贡献法,子数组问题)
     枚举子数组问题,常见有固定一个点,枚举另一个端点,还有枚举中间点。本题使用双指针算法,对右端点进行枚举,每次累加[l,r]区间内,所有以右端点为结尾的子数组对答案的贡献度,也就是长度r-l+1classSolution:defcountSubarrays(self,nums:List[int],k:int)->int:......
  • 51nod 2620 序列问题
    原题首先\(O(n\logn)\)的贪心很好想,显然用堆,每次合并两个权值最小的即可然后考虑\(O(n)\)怎么做?我们发现这个权值\(\max(a_i,a_{i+1})\)的\(\max\)很不好处理,因此我们考虑把他优化一下使用单调栈可以求出权值为\(a_i\)的合并区间,然后我们发现对于合并一个区间答案......
  • 哲学家就餐问题
    packagecom.shenzhen.dai;importlombok.AllArgsConstructor;importlombok.Data;importjava.util.ArrayList;importjava.util.List;importjava.util.Random;publicclassPhilosopherextendsThread{@Data@AllArgsConstructorstaticclassCho......
  • nginx 的安全策略问题
    1:前端嵌入iframe时,有时汇报安全策略如下:inaframebecauseanancestorviolatesthefollowingContentSecurityPolicydirective:"frame-ancestors‘self’。这里主要是frame-ancestors的参数需要调整。#不允许被嵌入,包括<frame>,<iframe>,<object>,<embed>和<appl......
  • 记一次OceanBase的线上问题排查
    问题是什么数据库报错Error1366(HY000):Incorrectstringvalue具体情况复现插入语句insertignoreintouser(name,disc_content)selectt1.name,group_concat(concat('{"评论人":"',t1.author,'","解决人":&q......