From 5ff0ff7979dbd9f3c84b76e10f6e06d6a5a1f43e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Tue, 2 Jan 2024 14:23:37 +0800 Subject: [PATCH] 'commit' --- TangDou/AcWing_TiGao/T4/1252.cpp | 6 +++--- TangDou/AcWing_TiGao/T4/1252.md | 32 ++++++++++++++++---------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/TangDou/AcWing_TiGao/T4/1252.cpp b/TangDou/AcWing_TiGao/T4/1252.cpp index 7583878..a01d631 100644 --- a/TangDou/AcWing_TiGao/T4/1252.cpp +++ b/TangDou/AcWing_TiGao/T4/1252.cpp @@ -14,13 +14,13 @@ int find(int x) { } int main() { - cin >> n >> m >> sum; + scanf("%d %d %d", &n, &m, &sum); // 初始化并查集 for (int i = 1; i <= n; i++) p[i] = i; // 读入每个云朵的价钱(体积)和价值 for (int i = 1; i <= n; i++) - cin >> v[i] >> w[i]; + scanf("%d %d", &v[i], &w[i]); while (m--) { int a, b; @@ -35,7 +35,7 @@ int main() { } // 01背包 // 注意:这里不能认为一维的能AC,二维的替代写法就一定能AC - // 这是因为这里的判断p[i]==i,导致i不一定是连通的, + // 这是因为这里的判断p[i]==i,导致i不一定是连续的, // 所以f[i][j]=f[i-1][j]这句话就不一定对 // 所以,看来终极版本的01背包一维解法还是有一定价值的。 for (int i = 1; i <= n; i++) diff --git a/TangDou/AcWing_TiGao/T4/1252.md b/TangDou/AcWing_TiGao/T4/1252.md index 1a196f2..f745490 100644 --- a/TangDou/AcWing_TiGao/T4/1252.md +++ b/TangDou/AcWing_TiGao/T4/1252.md @@ -49,32 +49,32 @@ $1≤n≤10000,0≤m≤5000,1≤w≤10000,1≤ci≤5000,1≤di≤100,1≤u_i,v_i using namespace std; const int N = 10010; -int n, m, sum; //有 n 朵云,m 个搭配,Joe有 sum 的钱。 -int v[N], w[N]; //表示 i 朵云的价钱和价值 -int p[N]; -int f[N]; +int n, m, sum; // 有 n 朵云,m 个搭配,Joe有 sum 的钱。 +int v[N], w[N]; // 表示 i 朵云的价钱和价值 +int p[N]; // 并查集数组 +int f[N]; // 01背包数组 -//最简并查集 +// 最简并查集 int find(int x) { - if (p[x] != x) p[x] = find(p[x]); //路径压缩 + if (p[x] != x) p[x] = find(p[x]); // 路径压缩 return p[x]; } int main() { - cin >> n >> m >> sum; - //初始化并查集 + scanf("%d %d %d", &n, &m, &sum); + // 初始化并查集 for (int i = 1; i <= n; i++) p[i] = i; - //读入每个云朵的价钱(体积)和价值 + // 读入每个云朵的价钱(体积)和价值 for (int i = 1; i <= n; i++) - cin >> v[i] >> w[i]; + scanf("%d %d", &v[i], &w[i]); while (m--) { int a, b; - cin >> a >> b; //两种云朵需要一起买 + cin >> a >> b; // 两种云朵需要一起买 int pa = find(a), pb = find(b); if (pa != pb) { - //集合有两个属性:总价钱、总价值,都记录到root节点上 + // 集合有两个属性:总价钱、总价值,都记录到root节点上 v[pb] += v[pa]; w[pb] += w[pa]; p[pa] = pb; @@ -82,14 +82,14 @@ int main() { } // 01背包 // 注意:这里不能认为一维的能AC,二维的替代写法就一定能AC - // 这是因为这里的判断p[i]==i,导致i不一定是连通的, + // 这是因为这里的判断p[i]==i,导致i不一定是连续的, // 所以f[i][j]=f[i-1][j]这句话就不一定对 // 所以,看来终极版本的01背包一维解法还是有一定价值的。 for (int i = 1; i <= n; i++) - if (p[i] == i) //只关心集合代表元素,选择一组 - for (int j = sum; j >= v[i]; j--) //体积由大到小,倒序,01背包 + if (p[i] == i) // 只关心集合代表元素,选择一组 + for (int j = sum; j >= v[i]; j--) // 体积由大到小,倒序,01背包 f[j] = max(f[j], f[j - v[i]] + w[i]); - //输出最大容量下获取到的价值 + // 输出最大容量下获取到的价值 printf("%d\n", f[sum]); return 0; }