第六重关:分组背包

2024-04-22 07:18
文章标签 分组 背包 第六 重关

本文主要是介绍第六重关:分组背包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述:

已知如下条件:

    N个物品

    容量为V的背包

    vi:第i个物品所占用的容量空间

    valuei:第i个物品所获得的价值数值

    这些背包被分成了p个组,并且每个组里面的物品最多选择一件或者不选

求解:

    该背包可以装下的最大价值是多少?

解题思路:

如果不看组内的细节的话,其实这就是一个01背包,所以第一层FOR循环,显然就是遍历组别。对于一个分组,有两种结果,选取组内最好的和不选。那么在第二重FOR的时候表示,是否选取这个组别,如果选取该组,那么我就要选取该组中价值最高。如果不选,那就不去选择即可。

for (int i = 1; i <= P; i++)
{    for (int j = V; j >= 0; j--){for (int k: Park[i]){if (j > v[k]){dp[j] = MAX(dp[j], dp[j - v[k]] + w[k]);}}}
}

题目:HDU 4341(这题目要是读不懂,对不起自己童年)

注意点:1)计算斜率的时候要注意y是不能等于0的,但是x是可以等于0的;2)如果斜率一样的话要按照y的大小进行排序,原因是钩子是从上面往下放出去的。它一定要先抓浅层的金矿,然后才能去抓深层的金矿。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int max_N = 201;
const int max_T = 40001;
const double eps = 0.000001;
struct NODE
{int x, y;int t, v;double mult;
}node[max_N];bool cmp(NODE a, NODE b)
{if (a.mult != b.mult) return a.mult < b.mult;else if (a.y != b.y) return a.y < b.y;
}double ABS(const double x)
{if (x > 0) return x;else return -x;
}int MAX(const int x, const int y)
{if (x > y) return x;else return y;
}int main()
{int N, T;int Case = 0;while (cin>> N>> T){int dp[max_T], tmp[max_T];memset(dp, 0, sizeof(dp));for (int i = 1; i <= N; i++){cin>> node[i].x>> node[i].y>> node[i].t>> node[i].v;node[i].mult = node[i].x*1.0 / node[i].y;}sort(node+1, node+N+1, cmp);for (int i = 2; i <= N; i++){if (node[i].mult == node[i-1].mult){node[i].t += node[i-1].t;node[i].v += node[i-1].v;}}for (int i = 1; i <= N; ){int k;for (int j = T; j >= 0; j--){for (k = i; k <= N && ABS(node[k].mult - node[i].mult) < eps; k++){if (node[k].t <= j){dp[j] = MAX(dp[j], dp[j-node[k].t] + node[k].v);}}}i = k;}cout<< "Case "<< ++Case<< ": ";cout<< dp[T]<< endl;}return 0;
} 

 

 

这篇关于第六重关:分组背包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Java中的stream流分组示例详解

《Java中的stream流分组示例详解》Java8StreamAPI以函数式风格处理集合数据,支持分组、统计等操作,可按单/多字段分组,使用String、Map.Entry或Java16record... 目录什么是stream流1、根据某个字段分组2、按多个字段分组(组合分组)1、方法一:使用 Stri

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

Java如何根据文件名前缀自动分组图片文件

《Java如何根据文件名前缀自动分组图片文件》一大堆文件(比如图片)堆在一个目录下,它们的命名规则遵循一定的格式,混在一起很难管理,所以本文小编就和大家介绍一下如何使用Java根据文件名前缀自动分组图... 目录需求背景分析思路实现代码输出结果知识扩展需求一大堆文件(比如图片)堆在一个目录下,它们的命名规

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

SpringValidation数据校验之约束注解与分组校验方式

《SpringValidation数据校验之约束注解与分组校验方式》本文将深入探讨SpringValidation的核心功能,帮助开发者掌握约束注解的使用技巧和分组校验的高级应用,从而构建更加健壮和可... 目录引言一、Spring Validation基础架构1.1 jsR-380标准与Spring整合1

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组