[codevs3269]混合背包
2024-08-31 12:53:47
题目大意:一道混合背包模板。
解题思路:分三种情况讨论,01和完全没什么问题,多重背包需要把物品分成$\log W[i]$件,然后01即可,分成W[i]件01会TLE。
读优大法好!
C++ Code:
#include<cstdio>
#include<cctype>
using namespace std;
#define max(i,j)(((i)>(j))?(i):(j))
char buf[4000004];
int bufpos;
inline void init(){
bufpos=0;
buf[fread(buf,1,4000000,stdin)]='\0';
}
inline int readint(){
int p=0,flag=false;
for(;!isdigit(buf[bufpos]);bufpos++)flag=(buf[bufpos]=='-');
for(;isdigit(buf[bufpos]);bufpos++)
p=(p<<3)+(p<<1)+buf[bufpos]-'0';
return (flag)?(-p):(p);
}
int n,v,f[200002];
int main(){
init();
n=readint(),v=readint();
while(n--){
int V=readint(),W=readint(),M=readint();
if(M==1)
for(int i=v;i>=V;--i)
f[i]=max(f[i],f[i-V]+W);
else
if(M==-1)
for(int i=V;i<=v;++i)
f[i]=max(f[i],f[i-V]+W);
else{
int k=1,p=1;
while(p<=M){
for(int i=v;i>=V*k;--i)
f[i]=max(f[i],f[i-V*k]+W*k);
p+=(k*=2);
}
p=M-p+k;
for(int i=v;i>=V*p;--i)
f[i]=max(f[i],f[i-V*p]+W*p);
}
}
printf("%d\n",f[v]);
return 0;
}
最新文章
- bootstrap内置网格式布局系统:
- 怎样制作FL Studio步进音序器中的节奏
- Spring入门学习(一)
- SIGGRAPH
- 一个简单的JUnit项目
- android 安卓 微信布局 [1]
- [html5] 学习笔记-Canvas应用
- Debug 运行正常,Release版本不能正常运行总结(转)
- ThinkPad安装deepin操作系统报错解决方法
- int*p[ ]与int(*p)[ ]的不同
- springboot~thymeleaf页面布局的步骤
- git添加/删除远程仓库
- Cron表达式解析
- Boost 和 Boost.Build 的设置
- JavaEE之JDBC编程[详解]
- python-类型转化
- quratz启动流程
- Delphi XE5 Android 调用手机震动
- linux shell脚本报错总结
- CentOS扩展库配置