P1064 [NOIP2006 提高组] 金明的预算方案 (依赖背包问题)(内附封面)

[NOIP2006 提高组] 金明的预算方案

题目描述

金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过 n n n 元钱就行”。今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:

主件附件
电脑打印机,扫描仪
书柜图书
书桌台灯,文具
工作椅

如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有 0 0 0 个、 1 1 1 个或 2 2 2 个附件。每个附件对应一个主件,附件不再有从属于自己的附件。金明想买的东西很多,肯定会超过妈妈限定的 n n n 元。于是,他把每件物品规定了一个重要度,分为 5 5 5 等:用整数 1 ∼ 5 1 \sim 5 15 表示,第 5 5 5 等最重要。他还从因特网上查到了每件物品的价格(都是 10 10 10 元的整数倍)。他希望在不超过 n n n 元的前提下,使每件物品的价格与重要度的乘积的总和最大。

设第 j j j 件物品的价格为 v j v_j vj,重要度为 w j w_j wj,共选中了 k k k 件物品,编号依次为 j 1 , j 2 , … , j k j_1,j_2,\dots,j_k j1,j2,,jk,则所求的总和为:

v j 1 × w j 1 + v j 2 × w j 2 + ⋯ + v j k × w j k v_{j_1} \times w_{j_1}+v_{j_2} \times w_{j_2}+ \dots +v_{j_k} \times w_{j_k} vj1×wj1+vj2×wj2++vjk×wjk

请你帮助金明设计一个满足要求的购物单。

输入格式

第一行有两个整数,分别表示总钱数 n n n 和希望购买的物品个数 m m m

2 2 2 到第 ( m + 1 ) (m + 1) (m+1) 行,每行三个整数,第 ( i + 1 ) (i + 1) (i+1) 行的整数 v i v_i vi p i p_i pi q i q_i qi 分别表示第 i i i 件物品的价格、重要度以及它对应的的主件。如果 q i = 0 q_i=0 qi=0,表示该物品本身是主件。

输出格式

输出一行一个整数表示答案。

样例 #1

样例输入 #1

1000 5
800 2 0
400 5 1
300 5 1
400 3 0
500 2 0

样例输出 #1

2200

提示

数据规模与约定

对于全部的测试点,保证 1 ≤ n ≤ 3.2 × 1 0 4 1 \leq n \leq 3.2 \times 10^4 1n3.2×104 1 ≤ m ≤ 60 1 \leq m \leq 60 1m60 0 ≤ v i ≤ 1 0 4 0 \leq v_i \leq 10^4 0vi104 1 ≤ p i ≤ 5 1 \leq p_i \leq 5 1pi5 0 ≤ q i ≤ m 0 \leq q_i \leq m 0qim,答案不超过 2 × 1 0 5 2 \times 10^5 2×105

大致思路

这种问题属于有依赖的背包问题,对于本题,状态又01背包的两种变为了五种:

  1. 不选
  2. 选主件
  3. 选主件和附件1
  4. 选主件和附件2
  5. 选主件和附件1和附件2

这样,不难得出以下4个方程:
( f [ j ] [ 0 ] 为主件, f [ j ] [ 1 ] 为附件 1 , f [ j ] [ 2 ] 为附件 2 ) (f[j][0]为主件,f[j][1]为附件1,f[j][2]为附件2) (f[j][0]为主件,f[j][1]为附件1f[j][2]为附件2)
f [ j ] = m a x ( f [ j ] , f [ j − w [ i ] [ 0 ] ] + v [ i ] [ 0 ] ∗ w [ i ] [ 0 ] ) f[j]=max(f[j],f[j-w[i][0]]+v[i][0]*w[i][0]) f[j]=max(f[j],f[jw[i][0]]+v[i][0]w[i][0])
f [ j ] = m a x ( f [ j ] , f [ j − w [ i ] [ 0 ] − w [ i ] [ 1 ] ] + v [ i ] [ 0 ] ∗ w [ i ] [ 0 ] + v [ i ] [ 1 ] ∗ w [ i ] [ 1 ] ) f[j]=max(f[j],f[j-w[i][0]-w[i][1]]+v[i][0]*w[i][0]+v[i][1]*w[i][1]) f[j]=max(f[j],f[jw[i][0]w[i][1]]+v[i][0]w[i][0]+v[i][1]w[i][1])
f [ j ] = m a x ( f [ j ] , f [ j − w [ i ] [ 0 ] − w [ i ] [ 2 ] ] + v [ i ] [ 0 ] ∗ w [ i ] [ 0 ] + v [ i ] [ 2 ] ∗ w [ i ] [ 2 ] ) f[j]=max(f[j],f[j-w[i][0]-w[i][2]]+v[i][0]*w[i][0]+v[i][2]*w[i][2]) f[j]=max(f[j],f[jw[i][0]w[i][2]]+v[i][0]w[i][0]+v[i][2]w[i][2])
f [ j ] = m a x ( f [ j ] , f [ j − w [ i ] [ 0 ] − w [ i ] [ 1 ] − w [ i ] [ 2 ] ] + v [ i ] [ 0 ] ∗ w [ i ] [ 0 ] + v [ i ] [ 1 ] ∗ w [ i ] [ 1 ] + v [ i ] [ 2 ] ∗ w [ i ] [ 2 ] ) f[j]=max(f[j],f[j-w[i][0]-w[i][1]-w[i][2]]+v[i][0]*w[i][0]+v[i][1]*w[i][1]+v[i][2]*w[i][2]) f[j]=max(f[j],f[jw[i][0]w[i][1]w[i][2]]+v[i][0]w[i][0]+v[i][1]w[i][1]+v[i][2]w[i][2])

附其他背包详解好文章

AC CODE

#include<bits/stdc++.h>
using namespace std;
const int N=114514;
//#define int long long int
int n,m,v[N][3],w[N][3];
int f[N];
int main(){cin>>n>>m;int vv,ww,q,tmp=0;for(int i=1;i<=m;i++){cin>>vv>>ww>>q;if(q==0){v[i][0]=vv;w[i][0]=ww;}else if(v[q][1]==0){v[q][1]=vv;w[q][1]=ww;}else {v[q][2]=vv;w[q][2]=ww;}}for(int i=1;i<=m;i++){for(int j=n;j>=v[i][0];j--){if(j>=v[i][0])f[j]=max(f[j],f[j-v[i][0]]+v[i][0]*w[i][0]);if(j>=v[i][0]+v[i][1]&&v[i][1]!=0)f[j]=max(f[j],f[j-v[i][1]-v[i][0]]+v[i][0]*w[i][0]+v[i][1]*w[i][1]);if(j>=v[i][0]+v[i][2]&&v[i][2]!=0)f[j]=max(f[j],f[j-v[i][2]-v[i][0]]+v[i][0]*w[i][0]+v[i][2]*w[i][2]);if(j>=v[i][0]+v[i][1]+v[i][2]&&v[i][1]!=0&&v[i][2]!=0)f[j]=max(f[j],f[j-v[i][1]-v[i][2]-v[i][0]]+v[i][0]*w[i][0]+v[i][1]*w[i][1]+v[i][2]*w[i][2]);}}cout<<f[n];return 0;
}

附:各背包问题代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+22;
int n,w[N],f[N][N],v[i],ww;
int ff[N];
void 01_bag(){for(int i=1;i<=n;i++){for(int j=1;j<=ww;j++){if(j>=w[i]) f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]);else f[i][j]=f[i-1][j];}}
}void 01_bag_2(){for(int i=1;i<=n;i++){for(int j=ww;j>=w[i];j--){if(j>=w[i])f[j]=max(f[j],f[j-w[i]]+v[i]);}}
}void wq_bag_1(){for(int i=1;i<=n;i++){for(int j=1;j<=ww;j++){if(j>=w[i])f[i][j]=max(f[i][j],f[i][j-w[i]]+v[i]);else f[i][j]=f[i-1][j];}}
}void wq_bag_2(){for(int i=1;i<=n;i++){for(int j=w[i];j<=ww;j++){f[j]=max(f[j],f[j-w[i]]+v[i]);}}
}void mix_bag(){for(int i=1;i<=n;i++){int num=min(p[i],ww/w[i]);for(int k=1;num>0;k<<1){if(k>num)k=num;num-=k;for(int j=ww;j>=c[i]*k;j--){f[j]=max(f[j],f[j-c[i]*k]+v[i]*k);}}}
}void ton_bag(){int style;for(int i=1;i<=n;i++){cin>>style;if(style==0){//完全背包 for(int j=w[i];j<=ww;j++){f[j]=max(f[j],f[j-w[i]]+v[i]);}}else if(style==1){//01for(int j=ww;j>=w[i];j--){f[j]=max(f[j],f[j-w[i]]+v[i]);}}else{//多重背包二进制优化 int num=min(p[i],ww/w[i]);for(int k=1;num>0;k>>1){if(k>num)k=num;num-=k;for(int j=ww;j>=w[i]*k;j--){f[j]=max(f[j],f[j-w[i]*k]+v[i]*k);}}}}
}void erwei_bag(){for(int i=1;i<=n;i++){for(int j=ww;j>=w[i];j--){for(int k=w2;j>=w2[i];k--){f[j][k]=max(f[j][k],f[j-w[i]][k-w2[i]]+v[i]);}}}
}void group_bag(){int group;//n is how many groupsfor(int i=1;i<=n;i++){cin>>group;//lengthfor(int j=1;j<=group;j++){//group's things}for(int j=ww;j>=0;j--){for(int k=1;k<=s;k++){if(j>=w[k]){f[j]=max(f[j],f[j-w[k]]+v[k]);}}}}
}
int main(){cin>>n>>ww;for(int i=1;i<=n;i++){cin>>w[i]>>v[i];}f[0][0]=0;ff[0]=0;return 0;
}

附封面

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/23602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 连接oracle pandas以简化excel的编写和数据操作

python代码 Author: liukai 2810248865qq.com Date: 2022-08-18 04:28:52 LastEditors: liukai 2810248865qq.com LastEditTime: 2023-07-06 22:12:56 FilePath: \PythonProject02\pandas以简化excel的编写和数据操作.py Description: 这是默认设置,请设置customMade, 打开koro…

Laravel 框架安装路由和控制器 ①

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; THINK PHP &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…

启动Flink显示初始化状态怎么解决?

启动Flink显示初始化状态怎么解决&#xff1f; Flink On Yarn模式 问题 flnk任务在跑的过程中&#xff0c; 有时候任务停掉了 &#xff0c;不过我有 定时任务&#xff0c;可以把失败的flink任务拉起来&#xff0c;但是因为最新的checkpoint做失败了&#xff0c;导致脚本无法拉…

mysql报错:name ‘_mysql‘ is not defined

原因是&#xff1a; Mysqldb 不兼容 python3.5 以后的版本 解决办法&#xff1a; 使用pymysql代替MySQLdb 在项目应用下的__init__.py 添加上去 import pymysqlpymysql.version_info (1, 4, 13, "final", 0) pymysql.install_as_MySQLdb()

ChatGPT即将取代程序员

W...Y的主页 相信ChatGPT大家已经都不陌生&#xff0c;我们经常会在工作和学习中应用。但是ChatGPT的发展速度飞快。功能也越来越全面。ChatGPT的文章也是层次不穷的出现&#xff0c;ChatGPT即将取代程序员的消息也铺天盖地。那ChatGPT真的会取代程序员吗&#xff1f;我们是否…

HDFS中的Federation联邦机制

HDFS中的Federation联邦机制 当前HDFS体系架构--简介局限性 联邦Federation架构简介好处配置示例 当前HDFS体系架构–简介 当前的HDFS结构有两个主要的层&#xff1a; 命名空间&#xff08;namespace&#xff09; 由文件&#xff0c;块和目录组成的统一抽象的目录树结构。由n…

300个智商测试FLASH智商游戏ACCESS数据库

最近在找IQ测试方面的数据&#xff0c;网上大多只留传着33道题这种类型&#xff0c;其他的又因各种条件&#xff08;比如图片含水印等&#xff09;不能弄&#xff0c;这是从测智网下载的一些测试智商的游戏数据&#xff0c;游戏文件是FLASH的&#xff0c;扩展名是SWF。 数据包总…

机器学习笔记之优化算法(七)线搜索方法(步长角度;非精确搜索;Wolfe Condition)

机器学习笔记之优化算法——线搜索方法[步长角度&#xff0c;非精确搜索&#xff0c;Wolfe Condition] 引言回顾&#xff1a; Armijo \text{Armijo} Armijo准则及其弊端 Glodstein \text{Glodstein} Glodstein准则及其弊端 Wolfe Condition \text{Wolfe Condition} Wolfe Condi…

在excel中整理sql语句

数据准备 CREATE TABLE t_test (id varchar(32) NOT NULL,title varchar(255) DEFAULT NULL,date datetime DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; INSERT INTO t_test VALUES (87896cf20b5a4043b841351c2fd9271f,张三1,2023/6/8 14:06); INSERT INTO t_test …

Maven可选依赖和排除依赖简单使用

可选依赖 可选依赖指对外隐藏当前所依赖的资源 在maven_04_dao的pom.xml,在引入maven_03_pojo的时候&#xff0c;添加optional <dependency><groupId>com.rqz</groupId><artifactId>maven_03_pojo</artifactId><version>1.0-SNAPSHOT&…

无涯教程-Perl - Subroutines(子例程)

定义子程序 Perl编程语言中 Subroutine子程序定义的一般形式如下: sub subroutine_name {body of the subroutine } 调用该Perl Subroutine的典型方式如下- subroutine_name( list of arguments ); 在Perl 5.0之前的版本中&#xff0c;调用 Subroutine的语法略有不同&…

设计模式之模板方法

一、概述 定义一个操作中的算法的骨架&#xff0c;将一些步骤延迟到子类中。 TemplateMethod使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。 二、适用性 1.一次性实现一个算法的不变的部分&#xff0c;并将可变的行为留给子类来实现。 2.各子类中公共…

Java课题笔记~ MyBatis接口开发(代理开发)

使用XML文件进行开发&#xff0c;在调用SqlSession进行操作时&#xff0c;需要指定MyBatis映射文件中的方法&#xff0c;这种调用方式过于烦琐。为解决此问题&#xff0c;MyBatis提供了接口开发的方式。 接口开发的目的&#xff1a; 解决原生方式中的硬编码 简化后期执行SQL …

nacos本地搭建+springCloud服务注册中心-nacos(简易实现)

一.nacos概述 nacos官网 二.Windows使用搭建nacos 较为完整使用参考 1.安装nacos 去nacos github下载nacos最新稳定版本&#xff0c;我用的是nacos-server-2.2.3.zip&#xff0c;下载后解压&#xff0c;得到 2.创建数据库 启动mysql&#xff0c;创建数据库nacos&#xff…

掌握 JVM 的参数及配置

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ JVM&#xff08;Java虚拟机&#xff09;是Java编程语言的核心组件之一&#xff0c;它负责执行Java程序&#xff0c;并提供一系列参数和配置选项&#xff0c;可以调整Java程…

Docker实战-操作Docker容器实战(一)

导语   在之前的分享中&#xff0c;我们介绍了关于如何去操作Docker镜像&#xff0c;下面我们来看看如何去操作容器。 简单来讲&#xff0c;容器是镜像运行的一个实例&#xff0c;与镜像不同的是镜像只能作为一个静态文件进行读取&#xff0c;而容器是可以在运行时进行写入操…

docker端口映射详解(随机端口、指定IP端口、随意ip指定端口、指定ip随机端口)

目录 docker端口映射详解 一、端口映射概述&#xff1a; 二、案例实验&#xff1a; 1、-P选项&#xff0c;随机端口 2、使用-p可以指定要映射到的本地端口。 Local_Port:Container_Port&#xff0c;任意地址的指定端口 Local_IP:Local_Port:Container_Port 映射到指定地…

Docker安装Grafana以及Grafana应用

Doker基础 安装 1、 卸载旧的版本 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 2、需要的安装包 sudo yum install -y yum-utils 3、设置镜像的仓库 yum-config-m…

Spring Boot 单元测试

目录 1.什么是单元测试&#xff1f; 2.单元测试的优点 3.Spring Boot 单元测试使用 3.1 生成单元测试的类 3.2 添加 Spring Boot 框架测试注解&#xff1a;SpringBootTest 3.3 添加单元测试业务逻辑 3.4 注解 Transactional 4. 断言 1.什么是单元测试&#xff1f; 单元…

39.利用matlab寻找素数(matlab程序)

1.简述 MATLAB嵌套循环允许使用一个循环在另一循环内&#xff0c;下面用一个嵌套循环来把所有从1到100的素数显示出来。 2.代码 %% 学习目标&#xff1a;寻找素数 clear sum5; %求0&#xff5e;100素数之和 ss0; %用来标定是否是素数&#xff0c;0表示不是 p…