【题意】n个物品,有wi和vi,组成若干个联通块,只能选取一个联通块,问得到m的价值时最小要多少空间(v)。n<=50,v<=10^7

【题解】

先用并查集找出各个联通块。

这题主要就是v太大了,跟以往的背包不同。

我们回想01背包,f[j+v[i]]=max(f[j]+w[i]);

在这里面很明显很多状态都没有用。

优化:如果有2个状态,v1<=v2 && w1>=w2 则(v2,w2)这个状态是没有用的。

我们回到滚动数组中:

f[i][j+v[i]]=max(f[i^1][j]+w[i]);

那么我们可以用两个优先队列,q0存以前的f[i-1],q1存当前的f[i]。

我们在求f[i]的时候,就把q0一个个pop出来,更新后放到q1里面去。

做完i,我们要把q1放到q0,然后做i+1。

在把q1放到q0的时候就把没用的状态去掉(对于(v,val),先按val从大到小排序,再按v从小到大排序,对同样的val取最小的v)。

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std; typedef long long LL;
const LL N=,INF=(LL)1e15;
LL n,m,fa[N],t[N],w[N],c[N][N];
struct node{LL v,val;}; struct cmp
{
bool operator () (node &x,node &y)
{
if(x.val==y.val) return x.v<y.v;
return x.val<y.val;
}
}; priority_queue<node,vector<node>,cmp> q0,q1; LL findfa(LL x)
{
if(fa[x]==x) return x;
return findfa(fa[x]);
} LL minn(LL x,LL y){return x<y ? x:y;} int main()
{
freopen("a.in","r",stdin);
freopen("me.out","w",stdout);
int T,cas=;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) fa[i]=i;
for(int i=;i<=n;i++)
{
int num,xx;
scanf("%lld%lld%d",&t[i],&w[i],&num);
for(int j=;j<=num;j++)
{
scanf("%d",&xx);
fa[findfa(i)]=findfa(xx);
}
}
memset(c,,sizeof(c));
for(int i=;i<=n;i++)
{
fa[i]=findfa(i);
c[fa[i]][++c[fa[i]][]]=i;
}
node x,p,f;
LL ans=INF;
for(int k=;k<=n;k++) if(c[k][])
{
// printf("k = %d\n",k);
while(!q0.empty()) q0.pop();
while(!q1.empty()) q1.pop();
x.v=;x.val=;
q0.push(x);
for(int j=;j<=c[k][];j++)
{
int i=c[k][j];
while(!q0.empty())
{
x=q0.top();q0.pop();q1.push(x);
f.v=x.v+t[i];
f.val=x.val+w[i];
if(f.v>=ans) continue;
if(f.val>=m) {ans=minn(ans,f.v);continue;}
q1.push(f);
}
LL mn=INF;
while(!q1.empty())
{
x=q1.top();q1.pop();
if(x.val>=m) ans=minn(ans,x.v);
if(x.v<mn) mn=x.v,q0.push(x);
// printf("v = %lld val = %lld\n",x.v,x.val);
}
}
// f[i^1][v+c[i]]=maxx(f[i^1][v+c[i]],f[i][v]+w[i]]);
}
if(ans<INF) printf("Case %d: %lld\n",++cas,ans);
else printf("Case %d: Poor Magina, you can't save the world all the time!\n",++cas);
}
return ;
}

【hdu3080】01背包(容量10^7)的更多相关文章

  1. HLOJ1366 Candy Box 动态规划(0-1背包改)

    题目描述: 给出N个盒子(N<=100),每个盒子有一定数量的糖果(每个盒子的糖果数<=100),现在有q次查询,每次查询给出两个数k,m,问的是,如果从N个盒子中最多打开k个盒子(意思是 ...

  2. 2018.08.10 atcoder Median Sum(01背包)

    传送门 题意简述:输入一个数组an" role="presentation" style="position: relative;">anan. ...

  3. HDU 3339 In Action【最短路+01背包模板/主要是建模看谁是容量、价值】

     Since 1945, when the first nuclear bomb was exploded by the Manhattan Project team in the US, the n ...

  4. POJ3211 Washing Clothes[DP 分解 01背包可行性]

    Washing Clothes Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 9707   Accepted: 3114 ...

  5. 【BZOJ-2427】软件安装 Tarjan + 树形01背包

    2427: [HAOI2010]软件安装 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 960  Solved: 380[Submit][Status ...

  6. hdu2546 01背包

    http://acm.split.hdu.edu.cn/showproblem.php?pid=2546 01背包问题,首先拿出5元买最贵的东西,那接下来就是背包容量m-5,物品数量n-1 的01背包 ...

  7. hdu 2955 01背包

    http://acm.hdu.edu.cn/showproblem.php?pid=2955 如果认为:1-P是背包的容量,n是物品的个数,sum是所有物品的总价值,条件就是装入背包的物品的体积和不能 ...

  8. FOJProblem 2214 Knapsack problem(01背包+变性思维)

    http://acm.fzu.edu.cn/problem.php?pid=2214 Accept: 4    Submit: 6Time Limit: 3000 mSec    Memory Lim ...

  9. hdu 3466 排序01背包

    也是好题,带限制的01背包,先排序,再背包 这题因为涉及到q,所以不能直接就01背包了.因为如果一个物品是5 9,一个物品是5 6,对第一个进行背包的时候只有dp[9],dp[10],…,dp[m], ...

随机推荐

  1. Flask 中文手册 0.10 文档

    Flask 中文手册 0.10 文档 欢迎使用 Flask 欢迎阅读 Flask 文档. 本文档分为几个部分.我推荐您先从 安装 开始,之后再浏览 快速入门 章节. 教程 比快速入门更详细地介绍了如何 ...

  2. 问题:调用 ASP.Net Core WebAPI的HTTP POST方法时,从 [FromBody] 中读取的 MongoDB GeoJsonObjectModel成员总是null

    问题描述: POST/PUT to ASP.Net Core with [FromBody] to a MongoDB GeoJsonObjectModel member is always null ...

  3. Unity动态换装之Spine换装

    注:转载请注明转载,并附原链接 http://www.cnblogs.com/liaoguipeng/p/5867510.html 燕双飞情侣 一.动态换装原理 换装,无非就是对模型的网格,或者贴图进 ...

  4. 使用Scrapy自带的ImagesPipeline下载图片,并对其进行分类。

    ImagesPipeline是scrapy自带的类,用来处理图片(爬取时将图片下载到本地)用的. 优势: 将下载图片转换成通用的JPG和RGB格式 避免重复下载 缩略图生成 图片大小过滤 异步下载 . ...

  5. linux学习(一)——学习之路

    首先,要学Linux编程,你得会用Linux,也就是得在命令行环境下生存下来.什么叫生存下来呢?就是我现在给你一台主机,键盘,显示器啥的,然后给你一个服务器版的Linux系统的光盘或者其他什么安装盘, ...

  6. 软件工程项目组Z.XML会议记录 2013/09/25

    软件工程项目组Z.XML会议记录 [例会时间]2013年9月25日周三21:30-22:10 [例会形式]小组讨论 [例会地点]三号公寓楼会客厅 [例会主持]李孟 [会议记录]肖俊鹏 会议整体流程 签 ...

  7. 简单java采集程序一

    [目标任务]通过该网站采集全国的手机号码段至数据库表中 [完成过程] 1.初涉正则表达式,学会写简单的正则表达式 2.获取单个网页内容,学会java中基本的IO流 3.将获取数据插入mysql数据库表 ...

  8. c#程序中的AssemblyInfo.cs

    在asp.net中有一个配置文件AssemblyInfo.cs主要用来设定生成的有关程序集的常规信息dll文件的一些参数,下面是默认的AssemblyInfo.cs文件的内容具体介绍 //是否符合公共 ...

  9. 软工实践Beta冲刺(2/7)

    队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...

  10. 微信公众号开发java框架:wx4j(MaterialUtils篇)

    wx4j-MaterialUtils的使用 函数说明:上传永久视频素材 参数:文件路径.视频描述(通过setter填充内容即可) 返回值:微信服务器返回的json字符串 public static S ...