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了… ...
随机推荐
- Navicat操作SQL server 2008R2文件.bak文件还原
项目操作过程中,利用Navicat操作SQL Server2008R2数据备份,结果发现数据丢失了很多,不得不先对数据丢失部分进行差异对比,然后再重新输入. 1.利用Navicat导出的数据格式为sq ...
- Spring MVC配置实例
1.下载Jar文件,添加到项目 lib文件夹中. 使用eclipse新建 Web 项目.下载导入相关的 jar 和 Tomcat.我的java版本是JDK1.8 对应的 Tomcat 版本是 8.0. ...
- springboot学习随笔(二):简单的HelloWorld
接上章搭建好springboot环境后,开始开发入门级HelloWorld 一.构建简单的springboot项目 1.新建项目,选择Spring/Spring Starter Project 2.N ...
- js自执行事件
let a = document.createElement("a");let event = new MouseEvent("click");a.downlo ...
- MySQL创建数据库时指定编码utf8mb4和添加用户
CREATE DATABASE `wordpress` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE DATABASE `wor ...
- dataTable转换成Json格式
#region dataTable转换成Json格式 /// <summary> /// /// </summary> /// <param name="dt& ...
- PHP通过身份证号码获取性别、出生日期、年龄等信息
$sex = substr($idcard, (strlen($idcard)==18 ? -2 : -1), 1) % 2 ? '1' : '2'; //18位身份证取性别,倒数第二位奇数是男,偶数 ...
- JVM-如何判断对象存活与否与CMS收集器和G1收集器的区别
JVM如何判断对象存活? 1.计数器 2.可达性分析 (很多主流语言采用这种方法来判断对象是否存活) 计数器:每当有一个地方引用该对象时,计数器 +1:引用失效则 -1: 优点:实现简单,判定效率 ...
- 1.express中间件的简介
express中间件的意思 1, 中间件是一个模块.在js中,模块意味着函数,所以中间件是一个函数.那么这个函数长什么样子? 这还要从中间件的功能说起,它拦截http 服务器提供的请求和响应对象,执行 ...
- JVM、redis缓存适用场景
1. 数据状态相对稳定:(针对数据本身)数据修改较少. 2. 输出的数据是相对幂等:(针对业务)多次查询期间,数据不变动.如果查询频率过高,缓存可能没有及时更新. 了解一下redis.ehcache. ...