Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了。但是这里的宝物实在是太多了,小FF的采集车

似乎装不下那么多宝物。看来小FF只能含泪舍弃其中的一部分宝物了……小FF对洞穴里的宝物进行了整理,他发现每样宝物都

有一件或者多件,他粗略的估算了下每样宝物的价值,之后开始了宝物筛选工作:小FF有一个最大载重为W的采集车,洞穴里总

共有n种宝物,每种宝物的价值为v[i],重量为w[i],每种宝物有m[i]件。小FF希望在采集车不超载的前提下,选择一些宝物装

进采集车,使得它们的价值和最大。 【数据范围】

对于30%的数据:n≤∑m[i]≤10^4; 0≤W≤10^3

对于100%的数据:n≤∑m[i]≤10^5;0≤W≤4*10^4; 1≤n≤100.

【输入格式】

第一行为一个整数N和W,分别表示宝物种数和采集车的最大载重。

接下来n行每行三个整数,其中第i行第一个数表示第i类品价值,第二个整数表示一件该类物品的重量,第三个整数为该类物品数量。

【输出格式】

输出仅一个整数ans,表示在采集车不超载的情况下收集的宝物的最大价值。

Sample Input

 4  20
3 9 3
5 9 1
9 4 2
8 1 3

Sample Output

 47

【题解】

这题的同种物品数量很多。很多嘛。肯定就要用特殊的办法。那就是,那就是,那就是二进制优化。

比如有一个类型的物品,有50个

31 的二进制是11111

而111111 == 63 > 50

所以我们先获得2^0 2^1 2^2 2^3 2^4.

然后用50-31;

得19;

然后我们再获得19;

总共我们获得了 1 2 4 8 16 19 这几个数字;

然后 我们就可以用这几个数字组合成1-50中任意的数字了。

于是我们生成若干个物品,他们的价值分别是1*c[i],2*c[i],4*c[i].....19*c[i],重量也同样扩大,即1*w[i],2*w[i],4*w[i]...19*w[i];

接下来解释重点。

为什么用这几个数字就能组合成1-50中的任意数字?

首先 1-31这些数字是肯定可以的了。

因为1-31就是xxxxx(5个数字)这样的情况。x可能等于1或0.这是其二进制形式。如果某个x等于1就相应的加上2^d就可以啦。

然后就是32-50

比如40

这些数字全部加起来等于50;

那么也就是说我们要除去一系列的数,且这些数的和等于10;

而1-31这些数字都能由1 2 4 8 16得来。所以 10也就没问题了。用这些数字中的一些数字组合成10,然后去掉就可以了。

综上 1 2 4 8 16 19这些数字可以组合成1-50中的任意一个数字。

生成那些物品后,就可以当做0/1背包问题来解决了

【代码】

#include <cstdio>
#include <cstring> int n,m,temp[30],w[2000],c[2000],nn = 0,f[50000]; void init()
{
temp[0] = 1;//2^0 == 1
for (int i = 1;i <= 20;i++) //获取2^i 存入temp[i]中
temp[i] = temp[i-1] * 2;
} void input_data()
{
scanf("%d%d",&n,&m);
for (int i = 1;i <= n;i++) //输入n个物品的信息
{
int cc,ww,num;
scanf("%d%d%d",&cc,&ww,&num);
int now =0;
while (num >= temp[now]) //temp[i]表示2^i now一开始等于0
{
nn++;
w[nn] = temp[now]*ww; //扩大成一个新的物品。
c[nn] = temp[now]*cc;
num-=temp[now];
now++;
}
if (num > 0) //还可能剩下一些物品 聚成一个就好
{
nn++;
w[nn] = num*ww;
c[nn] = num*cc;
}
}
} void get_ans()
{
memset(f,0,sizeof(f));
for (int i = 1;i <= nn;i++)
for (int j = m;j >= w[i];j--) //用0/1背包的更新方式更新解就可以啦
if (f[j] < f[j-w[i]] + c[i])
f[j] = f[j-w[i]] + c[i];
} void output_ans()
{
printf("%d\n",f[m]);
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
//freopen("F:\\rush_out.txt","w",stdout);
init();
input_data();
get_ans();
output_ans();
return 0;
}

【t077】宝物筛选的更多相关文章

  1. luogu||P1776||宝物筛选||多重背包||dp||二进制优化

    题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝物.看来小FF只能含泪 ...

  2. P1776 宝物筛选_NOI导刊2010提高(02)

    题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝物.看来小FF只能含泪 ...

  3. P1776 宝物筛选_NOI导刊2010提高(02)&& 多重背包二进制优化

    多重背包, 要求 \(N\log N\) 复杂度 Solution 众所周和, \(1-N\) 之内的任何数可以由 \(2^{0}, 2^{1}, 2^{2} ... 2^{\log N}, N - ...

  4. 【单调队列】【P1776】宝物筛选

    传送门 Description 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物--这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝 ...

  5. 洛谷P1776 宝物筛选_NOI导刊2010提高(02)

    P1776 宝物筛选_NOI导刊2010提高(02) 题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了, ...

  6. [luogu P1776] 宝物筛选 解题报告(单调队列优化DP)

    题目链接: https://www.luogu.org/problemnew/show/P1776 题目: 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF ...

  7. P1776 宝物筛选_NOI导刊2010提高(02)(背包的二进制优化)

    题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝物.看来小FF只能含泪 ...

  8. 洛谷p1776宝物筛选

    宝物筛选 多重背包问题 物品数目已知 可以枚举每个物品 当做01背包来做 不过会超时 此时需要二进制拆分来优化 分解成新的物品 再跑一遍01背包即可 //二进制拆分+01背包 //设f[j]表示前i件 ...

  9. 洛谷P1776 宝物筛选

    一道很好的单调队列优化多重背包入门题 令\(v[i]\)表示重量,\(w[i]\)表示价格 ,\(c[i]\)表示最多可放的数量,不难推出朴素的转移方程如下: \(f[i][j]=max\{f[i-1 ...

随机推荐

  1. Codeforces Round #277.5 解题报告

    又熬夜刷了cf,今天比正常多一题.比赛还没完但我知道F过不了了,一个半小时贡献给F还是没过--应该也没人Hack.写写解题报告吧= =. 解题报告例如以下: A题:选择排序直接搞,由于不要求最优交换次 ...

  2. eclipse-hierarchyviewer 不能使用

    今天安装了adt-bundle以后,发现hierarchyviewer不能用.点开了以后连手机没有效果.后来发现,还需要进入hierarchyviewer所在的sdk目录进行下权限的设置 chmod ...

  3. Flask项目之手机端租房网站的实战开发(六)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...

  4. 主定理(Master Theorem)与时间复杂度

    1. 问题 Karatsuba 大整数的快速乘积算法的运行时间(时间复杂度的递推关系式)为 T(n)=O(n)+4⋅T(n/2),求其最终的时间复杂度. 2. 主定理的内容 3. 分析 所以根据主定理 ...

  5. iOS 中使用 XIB 自定义cell的两种方法以及编译出现常见 的错误 (xcode6.0之后)

    一. 注册cell 1.创建自定义cell并勾选 xib :(勾选xib就会自动生成与cell文件关联的xib) 2.在 tableViewController里注册自定义Cell (或者遵守tabl ...

  6. Codeforces 232A - Cycles (构造 + 思维)

    题目链接: 232A - Cycles(点击打开) 题意: 要构成一个存在 \(k\) 个三元环的图,需要多少个点,输出顶点数 \(n\),并输出图. 题解: 题目中的任何图都可以用 \(90\)~ ...

  7. SpringMVC 学习笔记(十) 异常处理HandlerExceptionResolver

    Spring MVC 通过 HandlerExceptionResolver 处理程序的异常,包含 Handler 映射.数据绑定以及目标方法运行时发生的异常. SpringMVC 提供的 Handl ...

  8. [Angular2 Form] Reactive Form, FormBuilder

    Import module: import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/comm ...

  9. php课程 8-29 gd库能够画哪些东西

    php课程 8-29 gd库能够画哪些东西 一.总结 一句话总结:文字,点,线,圆,弧线,矩形,各种形状都是可以的,和html5中的canva能画的东西很像,使用也很像,参数怎么记呢,参数完全不用记, ...

  10. ocx中调用ocx

    BOOL CXXXApp::InitInstance()中加入一句AfxEnableControlContainer();