ZOJ3164【背包问题(好题)】
%%%%%%%%%%%%%%%岐爷
这一发从来没写过这么旺盛的背包问题。。。
想法很多,但是好难执行。
题意:
有N种饼干,1-N
每种最多想买Ki个,ki等于0的话没有上界
对于第i种饼干的权值是Ei
第i种饼干的价格Pi
有D钱。
还有G组
每组只能选一种。
思路:
有两种背包,一种是在一定的组里,还有没有特定关系;
没有特定关系的,如果没有限定数或者限定数*花费大于总费用,直接完全背包;否则就是二进制优化的0/1背包;
有特定关系的就是一个分组背包,先预处理第i组j花费下的最优情况,且初始化每组每个花费下的价值都是-INF,然后最后dp,之前还要预处理一种物品在j花费下所能达到的最优值;
最后dp将每一个分组的价格当做一次01背包 ,最里面再for一层。
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+50;
const int INF=0x3f3f3f3f;
int n,W; void zero_one(int dp[],int w,int val)
{
for(int i=W;i>=w;i--)
if(dp[i-w]>-INF)
dp[i]=max(dp[i],dp[i-w]+val);
} void compelet(int dp[],int w,int val)
{
for(int i=w;i<=W;i++)
if(dp[i-w]>-INF)
dp[i]=max(dp[i],dp[i-w]+val);
} void init(int dp[])
{
fill(dp,dp+W+1,-INF);
dp[0]=0;
} int Kkk[N],Eee[N],Ppp[N];
int mp[N];
int dp[N],temp[N];
char s[N];
int w[10][N]; int main()
{
while(~scanf("%d%d",&n,&W))
{
for(int i=1; i<=n; i++)
scanf("%d%d%d",&Kkk[i],&Eee[i],&Ppp[i]);
int G,len;
scanf("%d",&G);
getchar();
memset(mp,0,sizeof(mp));
for(int i=1; i<=G; i++)
{
gets(s);
len=strlen(s);
for(int j=0; j<len;)
{
if(s[j]>='1'&&s[j]<='9')
{
int sum=0;
while(s[j]>='0' && s[j] <= '9')
{
sum=sum*10+s[j]-'0';
j++;
}
mp[sum]=i;
}
else
j++;
}
} int k,ww,ept; init(dp);
for(int i=1;i<=G;i++)
init(w[i]); for(int i=1; i<=n; i++)
{
if(mp[i])
init(temp);
if(!Kkk[i]||Kkk[i]*Ppp[i]>=W)
{
compelet(mp[i]?temp:dp,Ppp[i],Eee[i]);
}
else
{
k=1;
while(k<=Kkk[i])
{
ww=k*Ppp[i];
ept=k*Eee[i];
zero_one(mp[i]?temp:dp,ww,ept);
Kkk[i]-=k;
k<<=1;
}
ww=Kkk[i]*Ppp[i];
ept=Kkk[i]*Eee[i];
zero_one(mp[i]?temp:dp,ww,ept);
}
if(mp[i])
for(int j=0;j<=W;j++)
w[mp[i]][j]=max(w[mp[i]][j],temp[j]); //预处理ww代表某一组里占花费j的最大收获
} for(int i=1;i<=G;i++)
for(int j=W;j>=0;j--)
for(int k=0;k<=j;k++)
if(dp[j-k]>-INF&&w[i][k]>-INF)
dp[j]=max(dp[j],dp[j-k]+w[i][k]); if(dp[W]>=0)
printf("%d\n",dp[W]);
else
puts("i'm sorry...");
puts("");
}
return 0;
} /*
2 1024
0 1 3
0 0 1
0 10 1023
1 1 1
1 1 2
1 1 4
1 1 8
1 1 16
1 1 32
1 1 64
1 1 128
3 -1 256
1 1 512
1
9 10 10 1023
1 1 1
1 1 2
1 1 4
1 1 8
1 1 16
1 1 32
1 1 64
1 1 128
1 1 256
1 1 512
1
9 10
*/
ZOJ3164【背包问题(好题)】的更多相关文章
- LeetCode刷题总结-动态规划篇
本文总结LeetCode上有动态规划的算法题,推荐刷题总数为54道.具体考点分析如下图: 1.中心扩展法 题号:132. 分割回文串 II,难度困难 2.背包问题 题号:140. 单词拆分 II,难度 ...
- 【DP_背包专题】 背包九讲
这段时间看了<背包九讲>,在HUST VJUDGE上找到了一个题单,挑选了其中16道题集中做了下,选题全部是HDU上的题,大多是简单题.目前做了点小总结,大概提了下每道题的思路重点部分,希 ...
- [BZOJ 2964] Boss单挑战
Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2964 Algorithm: 一道很新颖的背包问题 此题每个状态要维护的量巨多,而转移方式 ...
- 题解【AcWing487】金明的预算方案
题面 有依赖的背包问题模板题. 我们观察到 每个主件可以有 0 个.1 个或 2 个附件 , 于是考虑对于每一个主件,我们用枚举子集的方式枚举使用哪一些附件, 然后就是一个经典的分组背包问题了. 注意 ...
- 51nod 1086背包问题V2 (完全背包模板题)
1086 背包问题 V2 1 秒 131,072 KB 20 分 3 级题 题目描述 有N种物品,每种物品的数量为C1,C2......Cn.从中任选若干件放在容量为W的背包里,每种物品的体积为W1, ...
- NOIP2005普及组第3题 采药 (背包问题)
NOIP2005普及组第3题 采药 时间限制: 1 Sec 内存限制: 128 MB提交: 50 解决: 23[提交][状态][讨论版][命题人:外部导入] 题目描述 辰辰是个天资聪颖的孩子,他的 ...
- 杭电OJ 1248 不死族巫妖王 完全背包问题 字节跳动 研发岗编程原题
转载至:https://blog.csdn.net/ssdut_209/article/details/51557776 Problem Description不死族的巫妖王发工资拉,死亡骑士拿到一张 ...
- P1802 5倍经验日(01背包问题,水题)
题目背景 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却无奈的看着那一些比他等级高的好友,想着能否把他们干掉.干掉能拿不少经验的. 题目描述 现在absi2011拿出了x个迷你装药物 ...
- 采药 水题 dp 01背包问题 luogu1048
最基本的01背包,不需要太多解释,刚学dp的同学可以参见dd大牛的背包九讲,直接度娘“背包九讲”即可搜到 #include <cstdio> #include <cstring> ...
随机推荐
- Java ClassLoader详解(转载)
Java ClassLoader详解 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK ...
- js thiskeyword
相信大家都接触过this了,那么 this究竟是什么意思呢?看其字面意思就是个代词.指代其它的一些东西. 那么我们在程序其中,事实上也是一样.this也是个代词. 比方我们在java其中,this的k ...
- DotNetBar MessageBoxEx 显示中文 显示office2007风格
MessageBoxEx显示消息的时候按钮是中文的解决这个问题设置 MessageBoxEx的UseSystemLocalizedString属性为 true. MessageBoxEx.UseSys ...
- 怎样使用在线Webapp生成器生成安装包
在这篇文章中,我们来介绍怎样使用在线(online)的Webapp生成器来生产在Ubuntu手机或模拟器中能够安装的click安装包. Webapp生成器的地址:https://developer.u ...
- 用JS写九九乘法表
本来JS部分觉得就不是很好,结果经过一个寒假,在家的日子过的太舒适,基本把学的都快忘干净了,今天老师一说九九乘法表,除了脑子里浮现出要满足的条件,其他的都不记得了,赶快整理了一下: <scrip ...
- 九度OJ 1093:WERTYU (翻译)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1563 解决:609 题目描述: A common typing error is to place the hands on the ke ...
- 一款很好的日程安排插件fullcalendar 非常适合OA等系统
1.插件下载 http://arshaw.com/fullcalendar/download/ 2. <!DOCTYPE html> <meta http-equiv="C ...
- EM算法索引
把这n个{试验结果来自B的概率}求和得到期望,平均后,得到B出正面的似然估计,同理有p和q. 重复迭代,直到收敛为止 http://blog.csdn.net/junnan321/article/de ...
- 项目中一个普通的Java类如何获取service接口(一)
在普通的Java类中获取service接口目的是调用接口中的方法,实现数据的持久化等操作: Java类中的获取service接口方法: IfaceDetectService faceDetectSer ...
- [2017-10-26]Abp系列——DTO入参验证使用方法及经验分享
本系列目录:Abp介绍和经验分享-目录 声明式的入参验证逻辑 声明式入参验证主要使用了System.ComponentModel.DataAnnotations中提供的各种验证参数的Attribute ...