Educational Codeforces Round 61 (Rated for Div. 2) E 多重背包优化
https://codeforces.com/contest/1132/problem/E
题意
有8种物品,重量是1~8,每种数量是\(cnt[i]\)(1e16),问容量为W(1e18)的背包最多能装多少重量
题解1
- 多重背包二进制拆分物品转换成01背包,用map来剪枝掉无用的状态
#include<bits/stdc++.h>
#define ll long long
using namespace std;
map<ll,bool>f,g;
ll a[10],W,s[1005],ans;
vector<ll>w;
int main(){
cin>>W;
for(ll i=1;i<=8;i++){
cin>>a[i];
if(a[i]){
ans=max(ans,min(W/i,a[i])*i);
ll num=1;
while(a[i]>0){
w.push_back(min(num,a[i])*i);
a[i]-=min(num,a[i]);
num*=2;
}
}
}
sort(w.begin(),w.end());
reverse(w.begin(),w.end());
for(int i=w.size()-1;i>=0;i--)s[i]=s[i+1]+w[i];
f[0]=true;
for(int i=0;i<w.size();i++){
g.clear();
for(map<ll,bool>::iterator it=f.begin();it!=f.end();it++){
ll x=it->first;
g[x]=true;
if(x+w[i]<=W)g[x+w[i]]=true;
}
f.clear();
for(map<ll,bool>::iterator it=g.begin();it!=g.end();it++){
ll x=it->first;
if(x+s[i]<ans)continue;
f[x]=true;
ans=max(ans,x);
}
}
cout<<ans;
}
题解2
参考:https://blog.csdn.net/qq_37451344/article/details/88860699
- 设1到8的最小公倍数为lcm,则将lcm/V[i]看成一整份,然后枚举0到lcm/V[i]作为第二维
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll lcm=840;
ll W,a[10],V[10],dp[10][10005],ans;
int main(){
cin>>W;
for(int i=0;i<8;i++){
cin>>a[i];
V[i]=i+1;
}
memset(dp,-1,sizeof(dp));
dp[0][0]=0;
for(int i=0;i<8;i++){
ll num=lcm/V[i];
ll end=min(num,a[i]);
for(int j=0;j<=lcm*8;j++){
if(dp[i][j]<0)continue;
for(int k=0;k<=end;k++){
if(j+k*V[i]<=lcm*8)dp[i+1][j+k*V[i]]=max(dp[i+1][j+k*V[i]],
dp[i][j]+(a[i]-k)/num);
}
}
}
for(int i=0;i<=lcm*8;i++){
if(i>W)break;
if(dp[8][i]<0)continue;
ans=max(ans,i+lcm*min(dp[8][i],(W-i)/lcm));
}
cout<<ans;
}
Educational Codeforces Round 61 (Rated for Div. 2) E 多重背包优化的更多相关文章
- Educational Codeforces Round 61 (Rated for Div. 2) D,F题解
D. Stressful Training 题目链接:https://codeforces.com/contest/1132/problem/D 题意: 有n台电脑,每台电脑都有初始电量ai,也有一个 ...
- Educational Codeforces Round 61 (Rated for Div. 2)-C. Painting the Fence 前缀和优化
题意就是给出多个区间,要求去掉两个区间,使得剩下的区间覆盖范围最大. 当然比赛的时候还是没能做出来,不得不佩服大佬的各种姿势. 当时我想的是用线段树维护区间和,然后用单点判0,维护区间间断个数.然后打 ...
- Educational Codeforces Round 61 (Rated for Div. 2)
A. Regular Bracket Sequence 题意:给出四种括号的数量 (( )) () )( 问是否可以组成合法的序列(只能排序不能插在另外一个的中间) 思路: 条件一:一个或 n个) ...
- Educational Codeforces Round 61 (Rated for Div. 2) E. Knapsack
非常经典的dp题,因为1至8的最大公约数是840,任何一个数的和中840的倍数都是可以放在一起算的, 所以我只需要统计840*8的值(每个数字(1-8)的sum%840的总和),剩下都是840的倍数 ...
- Educational Codeforces Round 61 (Rated for Div. 2) G(线段树,单调栈)
#include<bits/stdc++.h>using namespace std;int st[1000007];int top;int s[1000007],t[1000007];i ...
- Educational Codeforces Round 61 (Rated for Div. 2)F(区间DP,思维,枚举)
#include<bits/stdc++.h>typedef long long ll;const int inf=0x3f3f3f3f;using namespace std;char ...
- Educational Codeforces Round 61 (Rated for Div. 2)D(二分,模拟,思维)
#include<bits/stdc++.h>using namespace std;typedef long long ll;int n,k;ll a[200007],b[200007] ...
- Educational Codeforces Round 37 (Rated for Div. 2)C. Swap Adjacent Elements (思维,前缀和)
Educational Codeforces Round 37 (Rated for Div. 2)C. Swap Adjacent Elements time limit per test 1 se ...
- Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship
Problem Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...
随机推荐
- ubuntu18.04下安装无线网卡驱动心得
联想Lenovo的笔记本,装完系统wifi显示找不到适配器. lspci | grep Wireless 显示无线网卡类型为博通的BCM43162. 网上一查,果然有问题. apt install f ...
- Jenkins安装第一个插件和通过离线安装包进行安装
1.打开左侧Manage Jenkins 选择Manage Plugins菜单 2.搜索Folders插件,该插件用于创建一个目录 3.点击安装进入插件安装状态,Jenkins会自动下载相关联的插件 ...
- (二十三)golang--内置函数
1.用于求长度,占多少个字节 2.内置函数new:分配内存,主要用来分配值类型,比如int.float等,其第一个实参为类型,而非值,其返回值为指向该类型的新分配的零值的指针: 3.make:用来分配 ...
- linux不同服务器SSH连接与数据传送
linux不同服务器通过SSH连接 SCP 命令进行数据传送 1. 安装scp yum install -y openssh-client 2.命令 复制文件(本地>>远程):scp /h ...
- CodeForce 359C Prime Number
Prime Number CodeForces - 359C Simon has a prime number x and an array of non-negative integers a1, ...
- .NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结
.NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结 前言 本文主要是关于.NET Standard 代码 在多框架 和 多平台 支持自己实践过程中遇到的一 ...
- LINQ 之 SelectMany
声明:本文为www.cnc6.cn原创,转载时请注明出处,谢谢! 一.第一种用法: public static IEnumerable<TResult> SelectMany<TSo ...
- 【MySQL】多表查询&事务&权限管理
多表查询: 查询语法: select 列名列表 from 表名列表 where.... 例子: 创建部门表 CREATE TABLE dept( id INT PRIMARY KEY AUTO_INC ...
- laravel 广播细节讲解
1.应用场景 1.通知(Notification) 或 信号(Signal) 2.通知是最简单的示例,也最经常用到.信号也可看作是通知的一种展现形式,只不过信号没有UI而已. 3.Activity S ...
- C#通过PInvoke调用c++函数的备忘录
目前知道的情况被调用的C/C++函数只能是全局函数 不能调用类中的成员方法 被调用的C函数必须使用extern “C“包含,保证采用的导出函数名生成规则和.NET一致 函数调用约定通常使用WINAPI ...