P3188-[HNOI2007]梦幻岛宝珠【背包】

正题

题目链接:https://www.luogu.com.cn/problem/P3188


题目大意

nnn个物品,大小为WWW的背包。

每个物品的大小可以表示为wi=ai2biw_i=a_i2^{b_i}wi=ai2bi,有价值viv_ivi

求选择一些物品不超过背包的大小使得价值最大。


解题思路

设先计算bib_ibi相同的物品,设fi,jf_{i,j}fi,j表示只计算b=ib=ib=i的物品时,一个容量为j∗2ij*2^{i}j2i时的背包时的最大价值。

然后将多个背包合并,设gi,jg_{i,j}gi,j表示只计算b≤ib\leq ibi的物品时,容量为j∗2i+W&(2i−1)j*2^i+W\&(2^i-1)j2i+W&(2i1)时的最大价值。

然后有转移方程gi,j=max{fi,j−k+gi−1,2k+(W>>(i−1))&1}g_{i,j}=max\{\ \ f_{i,j-k}+g_{i-1,2k+(W>>(i-1))\&1}\ \ \}gi,j=max{  fi,jk+gi1,2k+(W>>(i1))&1  }

然后答案就是g30,0g_{30,0}g30,0

时间复杂度O(nlog⁡a∑a)O(n\log a\sum a)O(nlogaa)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=110;
int n,W,a[N],v[N],lim[N];
int f[N][N*N],g[N][N*N];
vector<int> q[N];
int main()
{while(1){ memset(f,0,sizeof(f));memset(g,0,sizeof(g));memset(lim,0,sizeof(lim));for(int i=0;i<=30;i++)q[i].clear(); scanf("%d%d",&n,&W);if(n==-1)return 0;for(int i=1;i<=n;i++){int b=0;scanf("%d%d",&a[i],&v[i]);while(a[i]>10 || !(a[i]&1))b++,a[i]/=2;q[b].push_back(i);lim[b]+=a[i];}for(int i=0;i<=30;i++)for(int j=0;j<q[i].size();j++)for(int k=lim[i];k>=a[q[i][j]];k--)f[i][k]=max(f[i][k-a[q[i][j]]]+v[q[i][j]],f[i][k]);for(int i=0;i<=lim[0];i++)g[0][i]=f[0][i];for(int i=1;i<=30;i++){lim[i]+=(lim[i-1]+1)/2;for(int j=0;j<=lim[i];j++)for(int k=0;k<=j;k++)g[i][j]=max(g[i][j],f[i][j-k]+g[i-1][min(lim[i-1],2*k+((W>>i-1)&1))]);}printf("%d\n",g[30][0]);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【DP】I Will Like Matrix!

I Will Like Matrix! 题目大意&#xff1a; 有一个01矩阵&#xff0c;a[i][j1]a[i][j1]a[i][j1]和a[i1][j]a[i1][j]a[i1][j]必须大于a[i][j]a[i][j]a[i][j],问有多少种填法 原题&#xff1a; 题目描述 在一个 n ∗ m 的矩阵 A 的所有位置中分别填入 0 或 1&#xff0c;要求…

用Way.EntityDB进行Entity Framework Core数据库建模

Way.EntityDB是一个基于EF Core的数据层框架&#xff0c;它取消了EF Core的Migration机制&#xff0c;因为Migration并不是通用的&#xff0c;比如说sql server生成的migration&#xff0c;如果换成sqlite&#xff0c;运行时会报错的&#xff0c;也就是数据库不能更换。Way.Ent…

AT4513-[AGC030D]InversionSum【dp】

正题 题目链接:https://atcoder.jp/contests/agc030/tasks/agc030_d 题目大意 nnn个数&#xff0c;ppp次操作可以选择操作或者不操作&#xff0c;询问所有情况下逆序对的总和。 解题思路 转换成期望的问题&#xff0c;设fi,jf_{i,j}fi,j​表示所有情况下ai<aja_i<a_jai…

【dfs】【模拟】【树】I Like Matrix Forever!

I Like Matrix Forever! 题目大意&#xff1a; 有一个01矩阵&#xff0c;有一些操作&#xff1a;反转一个位置的数&#xff0c;反转一行的数&#xff0c;反转一列的数&#xff0c;回到第i次操作&#xff0c;每一次操作还要输出1的个数 原题&#xff1a; 题目描述 对一个 n…

Full_of_Boys训练4总结

题目来源&#xff1a;2017-2018 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2017) A.Cakey McCakeFace #include <bits/stdc.h> #define pb(x) push_back(x) typedef long long ll; const int maxn 20007; using namespace std; int n,m; ll …

.NET Core开发日志——Runtime IDentifier

.NET Core对于传统.NET开发人员而言是既熟悉又陌生的新平台&#xff0c;所以有时遇上出乎意料的事情也纯属正常情况。这时只需点耐心&#xff0c;多查查资料&#xff0c;努力找到原因&#xff0c;也未尝不是件有意义的体验。比如当建完一个最简单的控制台应用程序&#xff1a;d…

P3723-[AH2017/HNOI2017]礼物【FFT】

正题 题目链接:https://www.luogu.com.cn/problem/P3723 题目大意 两个长度为nnn的序列xxx和yyy&#xff0c;可以旋转序列xxx之后让一个序列的所有数加上一个非负整数ccc。 要求最小化∑i1n(xi−yi)2\sum_{i1}^n(x_i-y_i)^2i1∑n​(xi​−yi​)2 解题思路 其实就是要求最小…

初一模拟赛总结(5.11)

成绩&#xff1a; rank是有算其他dalaodalaodalao的 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4T5T5T5333lyflyflyf420420420100100100100100100100100100100100100202020444hkyhkyhky400400400100100100100100100100100100100100100000444fyfyfy40040…

Full_of_Boys训练5总结

题目来源&#xff1a;2017-2018 ACM-ICPC, NEERC, Moscow Subregional Contest A. Advertising Strategy 贪心方法&#xff1a;把一部分k放到初始值&#xff0c;剩下一部分&#xff0c;等到最后用。然后&#xff0c;枚举第一部分放多少即可。 #include <bits/stdc.h> typ…

C#语法——await与async的正确打开方式

C#5.0推出了新语法&#xff0c;await与async&#xff0c;但相信大家还是很少使用它们。关于await与async有很多文章讲解&#xff0c;但有没有这样一种感觉&#xff0c;你看完后&#xff0c;总感觉这东西很不错&#xff0c;但用的时候&#xff0c;总是想不起来&#xff0c;或者不…

jzoj1753-锻炼身体【单调队列】

正题 题目大意 n∗mn*mn∗m的有障碍物的网格&#xff0c;开始在(xs,ys)(x_s,y_s)(xs​,ys​)。有kkk段时间网格会倾斜&#xff0c;对于倾斜的方向可以选择移动或者不移动&#xff0c;求最长移动距离。 解题思路 因为每段时间方向唯一&#xff0c;所以我们对于每一列或每一行分…

【并查集】打击犯罪(ssl 2342)

打击犯罪 ssl 2342 题目大意&#xff1a; 有n个人某些人之间有连接&#xff08;连接成一个团伙&#xff09;&#xff0c;现在要最大的团伙人数不大于n/2&#xff0c;要最少要删掉几个人&#xff08;要按顺序删&#xff09; 原题&#xff1a; 题目描述&#xff1a; 某个地…

Full_of_Boys训练6总结

题目来源&#xff1a;2014-2015 ACM-ICPC, Asia Xian Regional Contest F. Color 第一道二项式反演。。膜题解: https://www.cnblogs.com/wmrv587/p/6681953.html #include<bits/stdc.h> typedef long long ll; const ll mod 1e9 7; using namespace std; ll q_pow(ll …

好代码是管出来的——.Net Core集成测试与数据驱动测试

软件的单元测试关注是的软件最小可执行单元是否能够正常执行&#xff0c;但是软件是由一个个最小执行单元组成的集合体&#xff0c;单元与单元之间存在着种种依赖或联系&#xff0c;所以在软件开发时仅仅确保最小单元的正确往往是不够的&#xff0c;为了保证软件能够正确运行&a…

Full_of_Boys训练7总结

题目来源&#xff1a;2016沈阳区域赛 C.Recursive sequence 矩阵快速幂&#xff0c;思路来自oldz #include <bits/stdc.h> typedef unsigned long long ll; const ll mod2147493647; using namespace std; ll A[7][7]{{1,0,0,0,0,0,0},{1,1,0,0,0,0,0},{1,2,1,0,0,0,0},{…

CF961G-Partitions【斯特林数】

正题 题目链接:https://www.luogu.com.cn/problem/CF961G 题目大意 nnn个物品分成kkk个组&#xff0c;每个物品权值为wiw_iwi​。一个子集SSS的权值为∣S∣∑x∈Swx|S|\sum_{x\in S}w_x∣S∣∑x∈S​wx​。 求所有划分方法的权值和。 解题思路 考虑对于每个数wiw_iwi​的贡献…

【高精】【快速幂】穿越丛林(ssl 2314)

穿越丛林 ssl 2314 题目大意&#xff1a; 求2n2^n2n 原题&#xff1a; 题目描述&#xff1a; ljj 是一位富有冒险心又很喜欢研究数学的孩纸&#xff0c;有一天&#xff0c;他到一个丛林冒险&#xff0c;这里的树长有像0、4、6、8、9这样形状的洞&#xff0c;他要想穿过丛…

谈谈surging引擎的tcp、http、ws协议和如何容器化部署

1、前言分布式已经成为了当前最热门的话题&#xff0c;分布式框架也百花齐放&#xff0c;群雄逐鹿。从中心化服务治理框架&#xff0c;到去中心化分布式服务框架&#xff0c;再到分布式微服务引擎&#xff0c;这都是通过技术不断积累改进而形成的结果。esb,网关&#xff0c;ngi…

2018陕西省赛K题[watermelon_planting]

题意:有一个序列a[]&#xff0c;描述的是另一个序列ans[]每个位置单位时间的增量。每个单位时间每个位置都会增加一个单位对应增量。时间总长m&#xff0c;每个单位时间包含有两种操作中的一个&#xff1a;1.询问ans[]在[l,r]区间的和&#xff1b;2.修改&#xff1a;a[]在[l,r]…

【并查集】银河英雄传说 (luogu 1196/ssl 1225)

银河英雄传说 luogu 1196 ssl 1225 题目大意&#xff1a; 有n列船&#xff0c;每列一开始有一艘船&#xff0c;可以将某一艘船所在的列所有船接到另外一列&#xff0c;然后会问某两艘船是否在一列&#xff0c;如果在那中间有多少艘船 原题&#xff1a; 题目描述 公元五八…