%%%%%%%%%%%%%%%岐爷

这一发从来没写过这么旺盛的背包问题。。。

想法很多,但是好难执行。

题意:

有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【背包问题(好题)】的更多相关文章

  1. LeetCode刷题总结-动态规划篇

    本文总结LeetCode上有动态规划的算法题,推荐刷题总数为54道.具体考点分析如下图: 1.中心扩展法 题号:132. 分割回文串 II,难度困难 2.背包问题 题号:140. 单词拆分 II,难度 ...

  2. 【DP_背包专题】 背包九讲

    这段时间看了<背包九讲>,在HUST VJUDGE上找到了一个题单,挑选了其中16道题集中做了下,选题全部是HDU上的题,大多是简单题.目前做了点小总结,大概提了下每道题的思路重点部分,希 ...

  3. [BZOJ 2964] Boss单挑战

    Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2964 Algorithm: 一道很新颖的背包问题 此题每个状态要维护的量巨多,而转移方式 ...

  4. 题解【AcWing487】金明的预算方案

    题面 有依赖的背包问题模板题. 我们观察到 每个主件可以有 0 个.1 个或 2 个附件 , 于是考虑对于每一个主件,我们用枚举子集的方式枚举使用哪一些附件, 然后就是一个经典的分组背包问题了. 注意 ...

  5. 51nod 1086背包问题V2 (完全背包模板题)

    1086 背包问题 V2 1 秒 131,072 KB 20 分 3 级题 题目描述 有N种物品,每种物品的数量为C1,C2......Cn.从中任选若干件放在容量为W的背包里,每种物品的体积为W1, ...

  6. NOIP2005普及组第3题 采药 (背包问题)

    NOIP2005普及组第3题 采药 时间限制: 1 Sec  内存限制: 128 MB提交: 50  解决: 23[提交][状态][讨论版][命题人:外部导入] 题目描述 辰辰是个天资聪颖的孩子,他的 ...

  7. 杭电OJ 1248 不死族巫妖王 完全背包问题 字节跳动 研发岗编程原题

    转载至:https://blog.csdn.net/ssdut_209/article/details/51557776 Problem Description不死族的巫妖王发工资拉,死亡骑士拿到一张 ...

  8. P1802 5倍经验日(01背包问题,水题)

    题目背景 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却无奈的看着那一些比他等级高的好友,想着能否把他们干掉.干掉能拿不少经验的. 题目描述 现在absi2011拿出了x个迷你装药物 ...

  9. 采药 水题 dp 01背包问题 luogu1048

    最基本的01背包,不需要太多解释,刚学dp的同学可以参见dd大牛的背包九讲,直接度娘“背包九讲”即可搜到 #include <cstdio> #include <cstring> ...

随机推荐

  1. 基于LRU Cache的简单缓存

    package com.test.testCache; import java.util.Map; import org.json.JSONArray; import org.json.JSONExc ...

  2. MySQL 存储过程 (2)

    通过存储过程查询数据库返回条数操作 第一步:登录自定义用户建立存储过程需要调用测试用到的student表,具体操作如下 (1) 登录用户

  3. EasyDarwin添加自定义的服务模块EasyMyModule

    EasyDarwin模块的要求 每个QTSS模块必须实现两个方法函数: 一个Main入口函数,服务器在启动的时候将调用这个方法函数,来对您开发的模块所在的QTSS stub库进行初始化. 一个Disp ...

  4. mysql的事务隔离级别及其使用场景

    1 什么是事务隔离级别 事务隔离指的是事务之间同步关系. 2 食物隔离级别的分类 第一隔离级别,脏读级别 在脏读级别下,第一个事务修改了某个数据,但是还没有提交,第二个事务可以读取到这个未提及的数据. ...

  5. Qt JSON解析生成笔记

    对于这样一段json { "name": "布衣食", "gender": "Male", "age" ...

  6. myeclipse查看项目在本地的路径

    打开myeclipse编译器,选择项目,右键:选择properties 在这一侧的搜索框中输入:resource Location即是项目的在本地的路径. 亲测好使.

  7. s:iterator

    s:iterator 标签有3个属性:     value:被迭代的集合     id   :指定集合里面的元素的id     status 迭代元素的索引 1:jsp页面定义元素写法 数组或list ...

  8. RTSP(Real Time Streaming Protocol)学习笔记 -- RFC2326

    Real Time Streaming Protocol (RTSP)  RTSP是用在娱乐或通讯中控制流媒体服务器的网络协议,它可以创建和控制两个端点之间的会话. Client发出一些命令来控制me ...

  9. static静态数据的初始化

    package com.demo.book; public class StaticInitialization { static Table table = new Table(); static ...

  10. LuoguP4861 按钮

    传送门 这题一眼看上去要解\(k^x \equiv 1(mod\ m)\)的最小正整数解. 于是我打了一个扩展BSGS 这题这样做算的答案一直是0的.不过有另一个定理欧拉定理,\(k^{\varphi ...