装备购买
讲一下我的做法,不按照行向量考虑而是按照列向量考虑,将所有的
我们先不管
于是一个很自然的想法就是我们先将所有
证明:最终的向量组一定包含花费最低的向量,否则的话花费最低的向量可以被极大无关组表出,而且系数不全为
现在在考虑第
如果第
这道题目还卡精度。如果用double,精度不能太高,eps=1e-4,如果用long double,精度不能太低,eps=1e-8
然后解释一下蓝书上的做法
仔细想一下对行向量进行初等行变换会发生什么。不难发现(模拟一遍过程),假设我们当前在第
代码仓库的代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
long double a[510][510], eps = 1e-8;
int c[510], n, m, dim, ans;
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
double temp; scanf("%lf", &temp); a[i][j] = temp;
}
for (int i = 1; i <= n; i++) {
double temp; scanf("%lf", &temp); c[i] = temp;
}
int dim = 0;
// 对每个未知量xi进行一次消元
for (int i = 1; i <= m; i++) {
// 找到xi系数不为0、价格最低的一个
int now = 0;
for (int j = dim + 1; j <= n; j++) {
if (fabs(a[j][i]) > eps && (now == 0 || c[j] < c[now]))
now = j;
}
// xi是自由元
if (now == 0) continue;
// 向基底中增加一个向量
dim++;
ans += c[now];
for (int j = 1; j <= m; j++)
swap(a[now][j], a[dim][j]);
swap(c[now], c[dim]);
// 消去其它行中第i列的值
for (int j = 1; j <= n; j++)
if (dim != j && fabs(a[j][i]) > eps) {
long double rate = a[j][i] / a[dim][i];
for (int k = i; k <= m; k++)
a[j][k] -= a[dim][k] * rate;
}
}
cout << dim << ' ' << ans << endl;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构