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> ...
随机推荐
- POJ 2263 Heavy Cargo(ZOJ 1952)
最短路变形或最大生成树变形. 问 目标两地之间能通过的小重量. 用最短路把初始赋为INF.其它为0.然后找 dis[v]=min(dis[u], d); 生成树就是把最大生成树找出来.直到出发和终点能 ...
- javascript JS递归遍历对象 使用for(variable in object)或者叫for/in和forEach方式
1.递归遍历查找特定key值(ie9以下不支持forEach) 原文http://www.cnblogs.com/ae6623/p/5938560.html var obj = { first: &q ...
- [Phoenix] 六、MR在Ali-Phoenix上的使用
摘要: 在云HBASE上利用MR BULKLOAD入库PHOENIX表或通过MR构建PHOENIX索引表. 一.MR在Phoenix上的用途 利用MR对Phoenix表(可带有二级索引表)进行Bulk ...
- please add a 'mainClass’ property
when build an spring project with this command: mvn spring-boot:run there will may show an error mes ...
- java的取出map里所有元素的两种方式
/* * 取出map元素的两种方式 */package com.map.test; import java.util.HashMap;import java.util.Iterator;import ...
- php date之间的相互转换
字符串转成date $str =date("Y-m-d H:i:s",strtotime("2011-12-12 14:23:01")); echo $str; ...
- 理解vue ssr原理,自己搭建简单的ssr框架
前言 大多数Vue项目要支持SSR应该是为了SEO考虑,毕竟对于WEB应用来说,搜索引擎是一个很大的流量入口.Vue SSR现在已经比较成熟了,但是如果是把一个SPA应用改造成SSR应用,成本还是有些 ...
- vue项目刷新当前页面
场景: 有时候我们在vue项目页面做了一些操作,需要刷新一下页面. 解决的办法及遇到的问题: this.$router.go(0).这种方法虽然代码很少,只有一行,但是体验很差.页面会一瞬间的白屏,体 ...
- java random配置修改
不知道 报啥错的时候 ,改这个 vim /usr/java/latest/jre/lib/security/java.security 原值: securerandom.source=file:/de ...
- 网络抓取功能实现 将获取的结果进行过滤并写入到TXT文档中
下面是自己编写的 网络抓取功能实现 将获取的结果进行过滤并写入到TXT文档中 (以防忘记) 原创哟 import java.io.BufferedReader;import java.io.Buffe ...