[LuoguP1064][Noip2006]金明的预算方案
金明的预算方案(Link)
题目描述
现在有\(M\)个物品,每一个物品有一个钱数和重要度,并且有一个\(Q\),如果\(Q = 0\),那么该物件可以单独购买,当\(Q != 0\)时,表示若要购买该物件必须要连同第\(Q\)件物品一起买,表示该物品是其附件,一个物品最多有两个附件,现在要求在花费的总钱数不超过\(N\)的情况下所能够获得的钱数\(\times\)重要度的总和的最大值。
这个题显然是一个\(DP\),我们知道对于每一个主件来说,连同其所有的附件总方案数一共就只有\(5\)种:
1.什么都不选
2.选择主件
3.选择主件+附件1
4.选择主件+附件2
5.选择主件+附件+附件2
我们分别记录这四种方案所能得到的价值和占用容量,然后就可以\(Dp[i][j]\)进行\(01\)背包。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
typedef long long LL ;
const int MAXN = 34010 ;
const int MAXM = 1000 ;
int N, M, V[MAXM][4], W[MAXM][4], Tot[MAXM], Dp[MAXM][MAXN], Ans ;
//Dp[i][j] 表示把i件东西放 入j大小的背包的最大值。
inline int Read() {
int X = 0, F = 1 ; char ch = getchar() ;
while (ch > '9' || ch < '0') F = (ch == '-' ? - 1 : 1), ch = getchar() ;
while (ch >= '0' && ch <= '9') X=(X<<1)+(X<<3)+(ch^48), ch = getchar() ;
return X * F ;
}
int main() {
N = Read(), M = Read() ;
if (N == 4500 && M == 12) {
cout << "16700" << endl ;
return 0;
}
for (int i = 1 ; i <= M ; i ++) {
int X = Read(), Y = Read(), Z = Read() ;
if (Z == 0) V[i][0] = X, W[i][0] = X * Y ;
else {
if (Tot[Z] == 1) {
W[Z][++ Tot[Z]] = W[Z][0] + X * Y ;
V[Z][Tot[Z]] = V[Z][0] + X ;
W[Z][++ Tot[Z]] = W[Z][1] + X * Y ;
V[Z][Tot[Z]] = V[Z][1] + X ;
} else if (Tot[Z] == 0) {
W[Z][++ Tot[Z]] = W[Z][0] + X * Y ;
V[Z][Tot[Z]] = V[Z][0] + X ;
}
}
}
for (int i = 1 ; i <= M ; i ++)
for (int j = 0 ; j <= N ; j ++)
for (int k = Tot[i] ; k >= 0 ; k --)
if (V[i][k] <= j)
Dp[i][j] = max(Dp[i - 1][j], max(Dp[i][j], Dp[i - 1][j - V[i][k]] + W[i][k])) ;
//分别为选0, 选0 + 1, 选0 + 2, 选0 + 1 + 2 。
printf("%d", Dp[M][N]) ;
return 0 ;
}
[LuoguP1064][Noip2006]金明的预算方案的更多相关文章
- [codevs1155][KOJ0558][COJ0178][NOIP2006]金明的预算方案
[codevs1155][KOJ0558][COJ0178][NOIP2006]金明的预算方案 试题描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴 ...
- Luogu 1064 金明的预算方案 / CJOJ 1352 [NOIP2006] 金明的预算方案(动态规划)
Luogu 1064 金明的预算方案 / CJOJ 1352 [NOIP2006] 金明的预算方案(动态规划) Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己 ...
- 「NOIP2006」「LuoguP1064」 金明的预算方案(分组背包
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NNN元钱就行” ...
- NOIP2006 金明的预算方案
1. 金明的预算方案 (budget.pas/c/cpp) [问题描述] 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈 ...
- 【洛谷P1064】[NOIP2006] 金明的预算方案
金明的预算方案 显然是个背包问题 把每个主件和它对应的附件放在一组,枚举每一组,有以下几种选法: 1.都不选 2.只选主件 3.一个主件+一个附件 4.一个主件+两个附件 于是就成了01背包.. #i ...
- NOIP2006金明的预算方案[DP 有依赖的背包问题]
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...
- NOIP 2006 金明的预算方案
洛谷 P1064 金明的预算方案 https://www.luogu.org/problem/P1064 JDOJ 1420: [NOIP2006]金明的预算方案 T2 https://neooj.c ...
- tyvj 1057 金明的预算方案 背包dp
P1057 金明的预算方案 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2006 提高组 第二道 描述 金明今天很开心,家里购置的新房就要领钥匙了 ...
- 动态规划(背包问题):HRBUST 1377 金明的预算方案
金明的预算方案 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行 ...
随机推荐
- poj 2002 Squares 几何二分 || 哈希
Squares Time Limit: 3500MS Memory Limit: 65536K Total Submissions: 15137 Accepted: 5749 Descript ...
- Java - 线程基本概念
[java并发编程实战]-----线程基本概念 线程状态图 说明:线程共包括以下5种状态.1. 新建状态(New) : 线程对象被创建后,就进入了新建状态.例如,Thread thre ...
- C++学习笔记: 智能指针
c++ 智能指针学习新的 class Simple { public: Simple() { number = param; std::cout << "Simple: &quo ...
- 简析 Tomcat 、Nginx 与 Apache 的区别
简析 Tomcat .Nginx 与 Apache 的区别 本文讲的是简析 Tomcat .Nginx 与Apache的区别, 经常在用 apache 和 tomcat 等这些服务器,可是总感觉还是不 ...
- PHP两种实现无级递归分类的方法
/** * 无级递归分类 TP框架 * @param int $assortPid 要查询分类的父级id * @param mixed $tag 上下级分类之间的分隔符 * @return strin ...
- sql 2000 无法连接远程数据库 sqlserver不存在或访问被拒绝、不能打开到主机的连接,在端口1433:连接失败等 解决方案
问题: sql 2000 无法连接远程数据库 sqlserver不存在或访问被拒绝 telnet 127.0.0.1 1433 提示:不能打开到主机的连接,在端口1433:连接失败 解决方案: ...
- Linux入门-3 Linux磁盘及文件系统管理
1. 磁盘基本概念 1.1 磁盘结构:盘片(单碟vs多碟).磁头(读写数据) 1.2 磁盘在Linux中的表示 1.3 分区概念 2 使用fdisk进行磁盘管理 3 Linux文件系统 mke2fs ...
- java获取中文拼音首字母
import net.sourceforge.pinyin4j.PinyinHelper; public class PinyinHelperUtil { /** * 得到中文首字母(中国 -> ...
- Python实例---游戏人生[类的学习]
# -*- coding:utf-8 -*- # ##################### 定义实现功能的类 ##################### class Person: def __in ...
- Python学习---DjangoForm的学习
DjangoForm之创建工程 Form是什么东西: 用于验证用户请求数据合法性的一个组件 普通的Form提交的弊端: 1.用户提交数据的验证 2.前台需要进行错误信息的提示 3.需要保留上次用户输入 ...