第十个点RE求助(其他点都AC了)
  • 板块P1455 搭配购买
  • 楼主_hxh
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/1 19:55
  • 上次更新2024/7/1 22:14:56
查看原帖
第十个点RE求助(其他点都AC了)
536163
_hxh楼主2024/7/1 19:55

rt,求调

#include <bits/stdc++.h>
using namespace std;
const int N = 10005;
int n,m,w,x,y,pos,ff[N];
struct node
{
	int num,cost,value;//cost是价格,value是价值,下同 
}f[N];//每个云朵初始的编号,价格和价值 
struct node2
{
	int costt,valuee;
}a[N];//合并后一个集合的总价钱和价值 
int find(int k)
{
	if (f[k].num == k)
		return k;
	return f[k].num = find(f[k].num);
}//并查集函数 
int main()
{
	cin >> n >> m >> w;//n,m,w表示有n朵云,m个搭配和你现有的钱的数目
	for (int i = 1;i <= n;i++)
	{
		f[i].num = i;
		cin >> f[i].cost >> f[i].value;
	}//输入 
	for (int i = 1;i <= m;i++)
	{
		cin >> x >> y;
		f[find(x)].num = find(y);
	}//并查集操作 
	for (int i = 1;i <= n;i++)
		if (f[i].num != i)
		{
			f[find(f[i].num)].cost += f[i].cost;//价格 
			f[i].cost = 0;
			f[find(f[i].num)].value += f[i].value;//价值 
			f[i].value = 0;
		}//合并同一个集合云朵的总价格和价值 
	for (int i = 1;i <= n;i++)
		if (f[i].num == i)
		{
			a[++pos].costt = f[i].cost;
			a[pos].valuee = f[i].value;
		}//整理到同一个数组中,即去除上一步操作中价值和价格为空的云朵 
	for (int i = 1;i <= pos;i++)
	{
		for (int j = w;j >= 1;j--)
			if (ff[j] <= ff[j - a[i].costt] + a[i].valuee && j - a[i].costt >= 0)
				ff[j] = ff[j - a[i].costt] + a[i].valuee;
	}//01背包操作 
	cout << ff[w] << endl;
	return 0;
}
2024/7/1 19:55
加载中...