【luogu P1455 搭配购买】 题解

题目链接:https://www.luogu.org/problemnew/show/P1455

一句话题目做法:并查集合并+01背包

启示:要每次再find一遍。路径压缩会快。因为合并的时候如果是1连3,3连2,4连2,最后也不能保证一步就能连到fa上去。

结果会是fa[2] = fa[3] = fa[4] = 2.

    fa[1] = 3.

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 using namespace std;
 5 const int maxn = 10010;
 6 int n,m,money,fa[maxn];//n朵云,m个搭配,w现有钱的数目
 7 int qwqw[maxn],f[maxn],qwqc[maxn],w[maxn],c[maxn];
 8 int find(int x)
 9 {
10     return x==fa[x]?x:fa[x]=find(fa[x]);
11 }
12 int unionn(int x, int y)
13 {
14
15 }
16 int main()
17 {
18     scanf("%d%d%d",&n,&m,&money);
19
20     for(int i = 1; i <= n; i++)
21     fa[i] = i;
22
23     for(int i = 1; i <= n; i++)
24     {
25         int fee,d;
26         scanf("%d%d",&fee,&d);
27         w[i] = fee; c[i] = d;
28     }
29     for(int i = 1; i <= m; i++)
30     {
31         int u,v;
32         scanf("%d%d",&u,&v);
33         int x = find(u);
34         int y = find(v);
35         if(x!=y)
36         fa[y] = x;
37     }
38
39     for(int i = 1; i <= n; i++)
40     {
41         if(fa[i]!=i)
42         {
43             c[find(i)] += c[i];
44             w[find(i)] += w[i];
45             c[i] = 0; w[i] = 0;
46         }
47     }
48
49     for(int i = 1; i <= n; i++)
50         for(int v = money; v >= w[i]; v--)
51         f[v] = max(f[v],f[v-w[i]]+c[i]);
52     printf("%d",f[money]);
53     return 0;
54 }

原文地址:https://www.cnblogs.com/MisakaAzusa/p/8678251.html

时间: 2024-07-31 04:28:58

【luogu P1455 搭配购买】 题解的相关文章

洛谷——P1455 搭配购买

https://www.luogu.org/problem/show?pid=1455 题目描述 明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有n朵云,云朵已经被老板编号为1,2,3,……,n,并且每朵云都有一个价值,但是商店的老板是个很奇怪的人,他会告诉你一些云朵要搭配起来买才卖,也就是说买一朵云则与这朵云有搭配的云都要买,电脑组的你觉得这礼物实在是太新奇了,但是你的

洛谷P1455 搭配购买

题目描述 明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有n朵云,云朵已经被老板编号为1,2,3,--,n,并且每朵云都有一个价值,但是商店的老板是个很奇怪的人,他会告诉你一些云朵要搭配起来买才卖,也就是说买一朵云则与这朵云有搭配的云都要买,电脑组的你觉得这礼物实在是太新奇了,但是你的钱是有限的,所以你肯定是想用现有的钱买到尽量多价值的云. 输入输出格式 输入格式: 第1

P1455 搭配购买

#include<bits/stdc++.h>using namespace std;int n,m,w,f[10005],money[10005],v[10005],ans(0),dp[10005],used[10005],k(0);int ww[10005],mm[10005];int find(int x){ if(f[x]==x)return x; return find(f[x]);}void UN(int x,int y){ int a=find(x); int b=find(y)

搭配购买

洛谷P1455 搭配购买 把需要一起购买的物品放到并查集里,每一个并查集的标志是根节点,把v和w都累加,然后对根节点做01背包. #include<bits/stdc++.h> using namespace std; int dad[10001],f[10001],v[10001],bag,w[10001]; int n,m; int ans; int getfather(int x) { if(dad[x]==x) return x; dad[x]=getfather(dad[x]); r

luogu P1108 低价购买

题目链接 luogu P1108 低价购买 题解 朴素n^2dp,对于方案的转移利用加法原理,dp每一种最有解的方案 代码 #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; const int maxn = 60007; int f[maxn],c[maxn],a[maxn]; int cnt=0; int n; int m

洛谷1455 搭配购买(并查集)

洛谷1455 搭配购买 本题地址:http://www.luogu.org/problem/show?pid=1455 题目描述 明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有n朵云,云朵已经被老板编号为1,2,3,……,n,并且每朵云都有一个价值,但是商店的老板是个很奇怪的人,他会告诉你一些云朵要搭配起来买才卖,也就是说买一朵云则与这朵云有搭配的云都要买,电脑组的你觉

luogu P1541 乌龟棋 题解

\(luogu\) P1541 乌龟棋 题解 题目描述 这道题目想状态的时候想多了一维表示当前走了多少步,其实这个完全没有必要,因为根据你的牌的使用就可以知道你当前在哪一个位置. 状态 设\(f[i][j][k][l]\)表示已经用了\(i\)张步数为\(1\)的牌,\(j\)张步数为\(2\)的牌,\(k\)张步数为\(3\)的牌,\(l\)张步数为\(4\)的牌所能取得的最大分数. 转移 因为只有这四种牌,所以只需要枚举到达当前的步数的最后一步用的那张牌,然后对用四种牌的情况取\(\max\

BZOJ4004:[JLOI2015]装备购买——题解

https://www.lydsy.com/JudgeOnline/problem.php?id=4004 https://www.luogu.org/problemnew/show/P3265 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示 (1 <= i <= n; 1 <= j <= m),每个装备需要花费 ci,现在脸哥想买一些装备,但是脸哥很穷,所以总是盘算着怎样才能花尽量少的钱买尽量多的装备.

[luogu]P1262 间谍网络 题解

原题目:[luogu]P1262 间谍网络 数据范围好小啊(小声) 首先对于环 , 我们可以直接缩成点 , 如果环上的有好多可以收买的间谍的话就找其中要价最低的作为这个缩点后的点的要价 然后怎么处理呐? 我做完以后看到题解区有神仙一个循环就能处理出答案 但是我太菜了自己做的时候并没有想到qaq 所以就用了 DFS 再建一个缩点后的图 , 然后从每一个可以被收买的点上 DFS , 最后看看有没有点没有被搜到就可以了 如果说从一个可以被收买的点 a , 搜的时候找到了另一个已经搜过而且也是可以被收买