luogu||P1776||宝物筛选||多重背包||dp||二进制优化
题目描述
终于,破解了千年的难题。小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎。但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝物。看来小FF只能含泪舍弃其中的一部分宝物了……小FF对洞穴里的宝物进行了整理,他发现每样宝物都有一件或者多件。他粗略估算了下每样宝物的价值,之后开始了宝物筛选工作:小FF有一个最大载重为W的采集车,洞穴里总共有n种宝物,每种宝物的价值为v[i],重量为w[i],每种宝物有m[i]件。小FF希望在采集车不超载的前提下,选择一些宝物装进采集车,使得它们的价值和最大。
思路
典型的多重背包+二进制优化dp,看过背包九讲以后来水一波题,看到网上很多神犇利用左移右移来进行优化,我只能Orz,我先使用预处理,反正数字利用二进制优化以后不会太大,预处理到2^30,将物品的件数分解,最后利用0/1背包的模板输出答案,代码如下
#include<iostream>
#include<cstring>
#include<algorithm>
#include<ctime>
#include<cmath>
#include<iomanip> using namespace std;
const int maxn=;
int n,max_weight;
int ans=;
int f[maxn],weight[maxn],nums[maxn],values[maxn];
int k2[],k2s[];
void prem()//处理2^k
{
int sum=;
k2[]=;k2s[]=;k2s[]=;
for(int i=;i<=;i++)
{
k2[i]=k2[i-]*;
k2s[i]=k2s[i-]+k2[i];
}
}
int prek(int m)//处理系数
{
for(int i=;i<=m;i++)
{
if(m==)
return ;
if(m==)
return ;
if(m<k2[i])
return i-;
}
}
int sum=;
void input()
{
cin>>n>>max_weight; for(int i=;i<=n;i++)
{
int aa,bb,cc;
cin>>aa>>bb>>cc;
int temp=prek(cc);
cout<<temp<<endl;
for(int j=;j<=temp-;j++)
{
sum++;
weight[sum]=aa;
values[sum]=bb;
nums[sum]=k2[j];
}
cout<<k2s[temp]<<' '<<cc<<endl;
//if(k2s[temp]!=cc)
//{
if(temp==)
{
sum++;
weight[sum]=aa;values[sum]=bb;
nums[sum]=cc;
}
else
{
sum++;
weight[sum]=aa;values[sum]=bb;
nums[sum]=cc-k2[temp]+;
/*
sum++;
weight[sum]=aa;values[sum]=bb;
nums[sum]=cc-k2[temp]+1;
*/
} }
//cout<<"*********************************"<<endl;
/*
for(int i=1;i<=sum;i++)
{
cout<<weight[i]<<' '<<values[i]<<' '<<nums[i]<<endl;
}
*/
}
void solve()
{
for(int i=;i<=sum;i++)
for(int j=max_weight;j>=weight[i];j--)
{
f[j]=max(f[j],f[j-weight[i]]+values[i]);
}
cout<<f[max_weight];
}
int main()
{
prem();
input();
solve();
return ;
}
luogu||P1776||宝物筛选||多重背包||dp||二进制优化的更多相关文章
- [luogu P1776] 宝物筛选 解题报告(单调队列优化DP)
题目链接: https://www.luogu.org/problemnew/show/P1776 题目: 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF ...
- 洛谷 P1776 宝物筛选(多重背包)
题目传送门 解题思路: 可以转化成0-1背包来做,但暴力转化的话,时间不允许.所以就用了一个二进制划分的方法,将m个物品分成2,4,8,16,32......(2的次方)表示,可以证明这些数通过一定组 ...
- 动态规划:HDU2844-Coins(多重背包的二进制优化)
Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- HDU 1059(多重背包加二进制优化)
http://acm.hdu.edu.cn/showproblem.php?pid=1059 Dividing Time Limit: 2000/1000 MS (Java/Others) Me ...
- Luogu P1776 宝物筛选_NOI导刊2010提高(02)(多重背包模版)
传送门 多重背包板子题, 多重背包就是每种东西有好几个,可以把它拆分成一个一个的01背包 优化:二进制拆分(拆成1+2+4+8+16+...) 比如18=1+2+4+8+3,可以证明18以内的任何数都 ...
- CodeForces922E DP//多重背包的二进制优化
https://cn.vjudge.net/problem/1365218/origin 题意 一条直线上有n棵树 每棵树上有ci只鸟 在一棵树底下召唤一只鸟的魔法代价是costi 每召唤一只鸟,魔法 ...
- dp之多重背包(二进制优化)
void solve(int v,int w,int c){ int count=0; for(int k=1;k<=c;k<<=1) { val[c ...
- luogu P1776 宝物筛选_NOI导刊2010提高(02)
Sto flashhu orz flash太强啦 多重背包裸题(逃 使用压维大法,\(f_i\)为总重量为\(i\)时的答案 对于每种物品,记\(w\)为单个的重量,\(v\)为单个的价值,\(m\) ...
- POJ 1276 Cash Machine(多重背包的二进制优化)
题目网址:http://poj.org/problem?id=1276 思路: 很明显是多重背包,把总金额看作是背包的容量. 刚开始是想把单个金额当做一个物品,用三层循环来 转换成01背包来做.T了… ...
随机推荐
- The component and implementation of a basic gradient descent in python
in my impression, the gradient descent is for finding the independent variable that can get the mini ...
- Echarts属性大全(及时更新最新信息)
echarts属性的设置(完整大全) // 全图默认背景 // backgroundColor: ‘rgba(0,0,0,0)’, // 默认色板 color: ['#ff7f50','#87c ...
- tomcat Server启动带profile文件
一般mvn如果配置有环境,直接在tomcat server中无法直接启动,需要在vm或者tomcat启动中添加profile启动. pom.xml中添加: 在<profile>中添加默认p ...
- redis伪集群脚本
#安装redis伪集群脚本,先把redis-..gem及启动脚本放在/data1/redis-cluster目录下,然后执行该脚本即可 #!/bin/bash set -e #获取redis本机ip ...
- Linux安装Tomcat,运行Eclipse,web项目
到官网下载:https://tomcat.apache.org/download-80.cgi 在这里是8.5.39版本 下载tar,gz 提取解压后,我这里是放到opt目录下 cd 切换目录 / ...
- generator 生成器
L=[i*i for i in range(10)] print(L) G=(i*i for i in range(10)) #变中括号为小括号 print(G) 另一种方法: fib(max): n ...
- 2017-11-11 Sa Oct Spider
2017-11-11 Sa Oct Spider 4:33 PM Again. Firstly test liburl: # -*- coding: utf-8 -*- import json imp ...
- information_schema.COLUMNS
MySQL的information_schema库中有个COLUMNS表,里面记录了mysql所有库中所有表的字段信息,该表信息如下: COLUMNS表的每一条记录都对应了数据库中某个表的某个字段,该 ...
- 跑步“无核心,不PB”
核心力量不管是在跑步中,还是在生活中都有着重要的作用,核心能让你的身体机能更加强劲. 1.什么是核心肌群? 核心肌群就是指我们所说的躯干,包括脊柱.骨盆.及周围肌群. 核心肌群由腹直肌.腹横肌.腹斜肌 ...
- Spring开始
Spring 主要作用:spring的主要作用是解耦,降低代码间的耦合度(指降低类和类之间的耦合度).根据功能的不同,可以将系统中的代码分成主业务逻辑和系统级业务逻辑两类.Spring根据代码功能的特 ...