理解了思路之后开始敲代码,然后莫名出现了WA和TLE 照着lyd的代码改了几遍,发现还是这样……
//这是我自己的代码
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int N = 505, eps = 1e-5;
int n, m, dim, ans;
long double mar[505][505];
int pri[N];
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
scanf("%lf", &mar[i][j]);
for(int i = 1; i <= n; ++i) scanf("%d", pri+i);
for(int i = 1; i <= m; ++i)//对每个 xi 消元
{
int min_id = 0;
for(int j = dim+1; j <= n; ++j)
{
if(fabs(mar[j][i]) > eps && (min_id == 0|| pri[j] < pri[min_id])) min_id = j;
}
if(min_id == 0) continue;
dim++;ans += pri[min_id];
for(int j = 1; j <= m; ++j) swap(mar[dim][j], mar[min_id][j]);
swap(pri[dim], pri[min_id]);
for(int j = 1; j <= n; ++j)
{
if(dim == j || fabs(mar[j][i]) < eps) continue;
long double rate = mar[j][i] / mar[dim][i];
for(int k = i; k <= m; ++k) mar[j][k] -= mar[dim][k] * rate;
}
}
printf("%d %d\n", dim, ans);
return 0;
}
//这是lyd的
#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;
}