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了… ...
随机推荐
- js长整型的失真问题解决
遇到的问题: 后端返回的订单号是整型的,超过了Math.pow(2,53) = 9007199254740992,导致获取的数据失真. 类似问题:https://www.zhihu.com/quest ...
- gentoo 画框架图,流程图
需要话框架图,流程图的时候,只需要安装 dia 软件就可以了.
- Linux如何查看端口
Linux如何查看端口 1.lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000 # lsof -i:8000 COMMAND PID USER ...
- 如何利用Git生成pitch和打pitch
利用Git生成和应用patch 在程序员的日常开发与合作过程中,对于code的生成patch和打patch(应用patch)成为经常需要做的事情. 什么是patch?简单来讲,patch中存储的是你 ...
- VirtualBox虚拟机网络设置说明
1. 网络接入模式简介 VirtualBox的提供了四种网络接入模式,它们分别是: 1.NAT 网络地址转换模式(NAT,Network Address Translation) ...
- VirtualBox安装Ubuntu16.04过程
1. 软件版本 Windows: Win7/Win10 VirtualBox: VirtualBox-6.0.24-108355-Win Ubuntu: ubuntu-16.04-desktop-am ...
- leetcode125. Valid Palindrome
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...
- 【转】WPS word 文档中的插入对象 为什么打不开
点击桌面左下角开始按钮--所有程序,找到wps office文件夹--wps office工具--配置工具--高级--兼容设置,否选兼容第三方软件.
- css中有三个显示和隐藏的单词比较常见,display visibility 和 overflow我们需要区分开来
display display 设置或检索对象是否及如何显示 display: none 隐藏对象与它相反的是display:block 除了转换为块级元素之外,同时还有显示元素的意思 特点: 隐藏之 ...
- js解决下拉列表框互斥选项的问题
如图不区分选项与其他选项是互斥的关系,当选择了不区分时,其他选项就要去除,当有其他选项存在时,就不能有不区分 解决办法:定义change事件,若列表发生改变,首先判断点击的是否是不区分,若是,则将其他 ...