你的背包_01!

P01:01背包问题

       有N种物品和一个容量为V的背包。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包的容量,且价值总和最大。每种物品仅有一件。
P02:完全背包问题
       有N种物品和一个容量为V的背包。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包的容量,且价值总和最大。每种物品都有无限件。
P03:多重背包问题
       有N种物品和一个容量为V的背包。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包的容量,且价值总和最大。每种物品最多有n[i]件。


       P01:

       定义子状态dp[i][j],用来表示前i种物品(包括第i种物品)放入容量为j的背包中时,获得的最大价值,可以称它为第i个状态。那么,当那什么结束之后,就能得到dp[N][V],它就是第N个状态,表示的意思就是将前N种物品放入容量为V的背包中时,获得的最大价值,即是我们要求解的答案。

       那么,第i个状态是怎么来的呢?第N个状态又是如何那什么得来的?很简单,第i个状态肯定来自于第i-1个状态,由第N-1个状态就可得到第N个状态。当处于第i个状态时,第i种物品有两种选择:放入背包、不放入背包。因为每种物品有它自己的容量和价值,而且背包也有容量限制。所以,不是放得越多得到的价值总和最大。而是有选择的,从N种物品中选择一部分物品放入背包中,才能使得在不超过背包容量的情况下,价值总和最大。

       1、处于第i个状态时,第i种物品放入背包。此时,第i-1个状态是dp[i-1][j-c[i]],表示将前i-1个物品放入容量为j-c[i]的背包中时,获得的最大价值。因为第i种物品选择放入背包中,所以,第i-1个状态时,背包的容量为j-c[i]。那么此时dp[i][j]的值是多少呢?dp[i-1][j-c[i]]表示的是上一个状态的最大价值,再加上第i种物品的价值,就是dp[i][j]的值,dp[i][j]=dp[i-1][j-c[i]]+w[i].

       2、处于第i个状态时,第i种物品不放入背包。此时第i-1个状态是dp[i-1][j],表示将前i-1个物品放入容量为j的背包中时,获得的最大价值。因为第i种物品选择不放入背包中,所以不占体积。此时,dp[i][j]=dp[i-1][j]。

      综上:dp[i][j]=max(dp[i-1][j],dp[i-1][j-c[i]]+w[i]);

例题:HDU 2602

 
/**
**author :Or_me **
╭︿︿︿╮
{/ A  C /} 
 ( (OO) ) 
  ︶︶︶ 
**    **
**   题**
** 2014 年 月 日**
**/
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cctype>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
int c[1100],w[1100];
long long dp[1100][1100];
int main()
{
    int T;
    scanf("%d",&T);
    while (T--)
    {
      int n,v;
      scanf("%d%d",&n,&v);
      for (int i=1;i<=n;i++)
        scanf("%d",&w[i]);//价值
      for (int i=1;i<=n;i++)
        scanf("%d",&c[i]);//花费
      memset(dp,0,sizeof(dp));
      for (int i=1;i<=n;i++)
        for (int j=v;j>=0;j--)//这个题的数据很强,容量和体积都可能为0
        { 
          if (j>=c[i])
            dp[i][j]=max(dp[i-1][j],dp[i-1][j-c[i]]+w[i]);
          else
            dp[i][j]=dp[i-1][j];//保留了前一个状态
          printf("dp[%d][%d]~~~%d~~~\n",i,j,dp[i][j]);
        }
        
      printf("%I64d\n",dp[n][v]);
    }
    return 0;
}
测试数据:

Input

1
5 0
2 4 1 5 1
0 0 1 0 0
Output

12

       上面使用的方法,时间复杂度为O(N*V),空间复杂度也为O(N*V)。很明显,时间复杂度已经不能优化了,但空间复杂度还可以优化到O(V)。从O(N*V)优化到O(V),从这句话就能很明显的看出,定义子状态的dp数组从二维变到了一维。

       先来复习下01背包基本的思路,首先有一个主要的for循环for(int i=1;i<=n;i++)来表示对每个背包的选择,然后再是一个for循环for(int j=v;j>=0;j--)来计算对于第i种物品的所有值,dp[i][0...v]。dp[i][j]是由两个子状态dp[i-1][j]、dp[i-1][j-c[i]]递推而来,没有这两个子状态,就不能得出dp[i][j],当使用一维的数组f[j]时,在第二个for循环中,以j=v...0的顺序推f[j],就能保证推f[j]时f[f-c[i]]中保存的是状态dp[i-1][j-c[i]]的值。此时,状态转移方程dp[i][j]=max(dp[i-1][j],dp[i-1][j-c[i]]+w[i])就相当于f[j]=max(f[j],f[j-c[i]]+w[i])。在计算f[j]之前,f[j]里保存的是dp[i-1][j]的值,f[j-c[i]]保存的是dp[i-1][j-c[i]]的值,因为是逆序枚举的。

       这个就是滚动数组的应用。要理解如何从二维优化到一维,就要先理解好滚动数组,有一个计算斐波拉切数列第n项的小例子:

 
/**
**author :Or_me **
╭︿︿︿╮
{/ A  C /} 
 ( (OO) ) 
  ︶︶︶ 
**    **
**   题**
** 2014 年 月 日**
**/
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cctype>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    while (~scanf("%d",&n))
    {
        int a[4];
        a[0]=0;
        a[1]=1;
        a[2]=1;
        a[3]=2;
        if (n<=3)
            printf("%d\n",a[n]);
        else
        {
            for (int i=1;i<=n-3;i++)
            {
                a[1]=a[2];
                a[2]=a[3];
                a[3]=a[1]+a[2];
            }
            printf("%d\n",a[3]);
        }
        
    }
    return 0;
}


























【基于QT的调色板】是一个使用Qt框架开发的色彩选择工具,类似于Windows操作系统中常见的颜色选取器。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动和嵌入式设备,支持C++和QML语言。这个调色板功能提供了横竖两种渐变模式,用户可以方便地选取所需的颜色值。 在Qt中,调色板(QPalette)是一个关键的类,用于管理应用程序的视觉样式。QPalette包含了一系列的颜色角色,如背景色、前景色、文本色、高亮色等,这些颜色可以根据用户的系统设置或应用程序的需求进行定制。通过自定义QPalette,开发者可以创建具有独特视觉风格的应用程序。 该调色板功能可能使用了QColorDialog,这是一个标准的Qt对话框,允许用户选择颜色。QColorDialog提供了一种简单的方式来获取用户的颜色选择,通常包括一个调色板界面,用户可以通过滑动或点击来选择RGB、HSV或其他色彩模型中的颜色。 横渐变取色可能通过QGradient实现,QGradient允许开发者创建线性或径向的色彩渐变。线性渐变(QLinearGradient)沿直线从一个点到另一个点过渡颜色,而径向渐变(QRadialGradient)则以圆心为中心向外扩散颜色。在调色板中,用户可能可以通过滑动条或鼠标拖动来改变渐变的位置,从而选取不同位置的颜色。 竖渐变取色则可能是通过调整QGradient的方向来实现的,将原本水平的渐变方向改为垂直。这种设计可以提供另一种方式来探索颜色空间,使得选取颜色更为直观和便捷。 在【colorpanelhsb】这个文件名中,我们可以推测这是与HSB(色相、饱和度、亮度)色彩模型相关的代码或资源。HSB模型是另一种常见且直观的颜色表示方式,与RGB或CMYK模型不同,它以人的感知为基础,更容易理解。在这个调色板中,用户可能可以通过调整H、S、B三个参数来选取所需的颜色。 基于QT的调色板是一个利用Qt框架和其提供的色彩管理工具,如QPalette、QColorDialog、QGradient等,构建的交互式颜色选择组件。它不仅提供了横竖渐变的色彩选取方式,还可能支持HSB色彩模型,使得用户在开发图形用户界面时能更加灵活和精准地控制色彩。
标题基于Spring Boot的二手物品交易网站系统研究AI更换标题第1章引言阐述基于Spring Boot开发二手物品交易网站的研究背景、意义、现状及本文方法与创新点。1.1研究背景与意义介绍二手物品交易的市场需求和Spring Boot技术的适用性。1.2国内外研究现状概述当前二手物品交易网站的发展现状和趋势。1.3论文方法与创新点说明本文采用的研究方法和在系统设计中的创新之处。第2章相关理论与技术介绍开发二手物品交易网站所涉及的相关理论和关键技术。2.1Spring Boot框架解释Spring Boot的核心概念和主要特性。2.2数据库技术讨论适用的数据库技术及其在系统中的角色。2.3前端技术阐述与后端配合的前端技术及其在系统中的应用。第3章系统需求分析详细分析二手物品交易网站系统的功能需求和性能需求。3.1功能需求列举系统应实现的主要功能模块。3.2性能需求明确系统应满足的性能指标和安全性要求。第4章系统设计与实现具体描述基于Spring Boot的二手物品交易网站系统的设计和实现过程。4.1系统架构设计给出系统的整体架构设计和各模块间的交互方式。4.2数据库设计详细阐述数据库的结构设计和数据操作流程。4.3界面设计与实现介绍系统的界面设计和用户交互的实现细节。第5章系统测试与优化说明对系统进行测试的方法和性能优化的措施。5.1测试方法与步骤测试环境的搭建、测试数据的准备及测试流程。5.2测试结果分析对测试结果进行详细分析,验证系统是否满足需求。5.3性能优化措施提出针对系统性能瓶颈的优化建议和实施方案。第6章结论与展望总结研究成果,并展望未来可能的研究方向和改进空间。6.1研究结论概括本文基于Spring Boot开发二手物品交易网站的主要发现和成果。6.2展望与改进讨论未来可能的系统改进方向和新的功能拓展。
1. 用户与权限管理模块 角色管理: 学生:查看个人住宿信息、提交报修申请、查看卫生检查结果、请假外出登记 宿管人员:分配宿舍床位、处理报修申请、记录卫生检查结果、登记晚归情况 管理员:维护楼栋与房间信息、管理用户账号、统计住宿数据、发布宿舍通知 用户操作: 登录认证:对接学校统一身份认证(模拟实现,用学号 / 工号作为账号),支持密码重置 信息管理:学生完善个人信息(院系、专业、联系电话),管理员维护所有用户信息 权限控制:不同角色仅可见对应功能(如学生无法修改床位分配信息) 2. 宿舍信息管理模块 楼栋与房间管理: 楼栋信息:名称(如 "1 号宿舍楼")、层数、性别限制(男 / 女 / 混合)、管理员(宿管) 房间信息:房间号(如 "101")、户型(4 人间 / 6 人间)、床位数量、已住人数、可用状态 设施信息:记录房间内设施(如空调、热水器、桌椅)的配置与完好状态 床位管理: 床位编号:为每个床位设置唯一编号(如 "101-1" 表示 101 房间 1 号床) 状态标记:标记床位为 "空闲 / 已分配 / 维修中",支持批量查询空闲床位 历史记录:保存床位的分配变更记录(如从学生 A 调换到学生 B 的时间与原因) 3. 住宿分配与调整模块 住宿分配: 新生分配:管理员导入新生名单后,宿管可按专业集中、性别匹配等规则批量分配床位 手动分配:针对转专业、复学学生,宿管手动指定空闲床位并记录分配时间 分配结果公示:学生登录后可查看自己的宿舍信息(楼栋、房间号、床位号、室友列表) 调整管理: 调宿申请:学生提交调宿原因(如室友矛盾、身体原因),选择意向宿舍(需有空位) 审批流程:宿管审核申请,通过后执行床位调换,更新双方住宿信息 换宿记录:保存调宿历史(申请人、原床位、新床位、审批人、时间) 4. 报修与安全管理模块 报修管理: 报修提交:学生选择宿舍、设施类型(如 "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值