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

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

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

题意:

有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. PythonCookBook笔记——数据结构和算法

    数据结构和算法 解包赋值 p = [1, 2, 3] a, b, c = p # _表示被丢弃的值 _, d, _ = p # 可变长解包 *a, b = p # 字串切割解包 line = 'nob ...

  2. sql无限级树型查询

    表结构如下: 表数据如下: 一提到无限级,很容易想到递归,使用sql 的CET语法如下 with menu(Id,Name,ParentId,Level) as ( select Id,Name,Pa ...

  3. 网站web.cofig配置用户的权限

    访问被拒绝. 说明: 访问服务此请求所需的资源时出错.服务器可能未配置为访问所请求的 URL. 错误消息 401.2.: 未经授权: 服务器配置导致登录失败.请验证您是否有权基于您提供的凭据和 Web ...

  4. 2016/07/07 mymps(蚂蚁分类信息/地方门户系统)

    mymps(蚂蚁分类信息/地方门户系统)是一款基于php mysql的建站系统.为在各种服务器上架设分类信息以及地方门户网站提供完美的解决方案. mymps,整站生成静态,拥有世界一流的用户体验,卓越 ...

  5. 在MFC中使用大漠插件

    打开Class Wizard,Add Class...->MFC Class From TypeLib... File->Location->>> Finish-> ...

  6. Tomcat设置虚拟文件夹

    需求 在做B/S的应用时.常常会遇到一个问题,站点上传的一些图片不是保存在应用server以下.而是保存在别的文件夹,可是页面中又需要能訪问到这些图片.这时,应用server的"虚拟文件夹& ...

  7. No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386).错误解决方法

    targets ->build setting 下的 Build Active Architecture Only 设置 NO  就可以.

  8. Flask内置命令行工具—CLI

    应用发现 flask命令在Flask库安装后可使用,使用前需要正确配置FLASK_APP环境变量以告知用户程序所在位置.不同平台设置方式有所不同. Unix Bash (Linux, Mac, etc ...

  9. html标签默认属性值之margin;padding值

    一.h1~h6标签:有默认margin(top,bottom且相同)值,没有默认padding值. 在chrome中:16,15,14,16,17,19; 在firefox中:16,15,14,16, ...

  10. html body div height: 100%;

    最近做了测试 html{ height: 100%;//全部内容高度,包括滚动出现的内容 background-color:#000;} body{height: 100%;//只一页屏幕,用作滚动的 ...