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

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

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

题意:

有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. Sping中Bean配置的深入探讨

    一.p命名空间的使用 Spring 从 2.5 版本开始引入了一个新的 p 命名空间,可以通过 <bean> 元素属性的方式配置 Bean 的属性.使用 p 命名空间后,基于 XML 的配 ...

  2. ElasticSearch(三)mac安装

    1.首先要安装jdk 2.到官网或是用brew下载ElasticSearch 安装包,这边我们选择在官网下载对应的安装包 https://www.elastic.co/cn/downloads/ela ...

  3. mongodb学习之:主从复制

    在sql server能够做到读写分离,双机热备份和集群部署,这些在mongodb也能做到.首先来看主从复制.我们就在一台电脑上进行操作 第一步:分别建立master和slave两个文件夹 第二步:开 ...

  4. 2014 ACM-ICPC Beijing Invitational Programming Contest

    点击打开链接 Happy Reversal Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      J ...

  5. ubuntu 16.04安装Jenkins

    快速安装: sudo wget -q -O - http://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add - sudo ...

  6. Machine Learning in Action(6) AdaBoost算法

    Adaboost也是一种原理简单,但很实用的有监督机器学习算法,它是daptive boosting的简称.说到boosting算法,就不得提一提bagging算法,他们两个都是把一些弱分类器组合起来 ...

  7. failed to load AppCompat ActionBar with unkNown error

    解决办法: 在AndroidManifest.xml文件中找到 全局样式文件 Theme,如图: 进入到这个文件,在前面增加 "Base".,如图:

  8. Technocup 2017 - Elimination Round 2 C. Road to Cinema —— 二分

    题目链接:http://codeforces.com/problemset/problem/729/C C. Road to Cinema time limit per test 1 second m ...

  9. "未预编译文件 因此不能请求该文件"问题处理

    手里一个项目重新编译后发布,访问时提示未预编译文件“default.aspx”, 因此不能请求该文件.综合网上的解决方法,做了如下操作: 1.重新安装了AJAX Extension: 2.项目添加引用 ...

  10. dtd文件中写的引用实体被xml文件引用后无法在浏览器中显示的问题

    解决方案:把dtd文件由被xml文件外部引用改成被xml文件内部引用. 例子: 1.xml文件: <?xml version="1.0" encoding="UTF ...