题目大意:
有N件装备,每件装备有M个属性,用向量zi(aj,.....,am)表示。
有
N
件
装
备
,
每
件
装
备
有
M
个
属
性
,
用
向
量
z
i
(
a
j
,
.
.
.
.
.
,
a
m
)
表
示
。
每个装备需要花费ci,如果一件装备的属性能用购买的其他装备组合出,那么这件装备就没有买的必要了。
每
个
装
备
需
要
花
费
c
i
,
如
果
一
件
装
备
的
属
性
能
用
购
买
的
其
他
装
备
组
合
出
,
那
么
这
件
装
备
就
没
有
买
的
必
要
了
。
脸哥想要在买下最多数量的装备的情况下花最少的钱,问最少的花费跟选择的方案。
脸
哥
想
要
在
买
下
最
多
数
量
的
装
备
的
情
况
下
花
最
少
的
钱
,
问
最
少
的
花
费
跟
选
择
的
方
案
。
1<=n;m<=500;0<=aj<=1000 1 <= n ; m <= 500 ; 0 <= a j <= 1000
分析:
从小到大排序,
然后贪心选取,
动态维护线性基
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define eps 1e-6
#define N 505
using namespace std;
typedef long double Ld;
struct Node {
Ld a[N];
int v;
}a[N];
int n, m, f[N];
bool cmp(Node aa, Node bb) {
return aa.v < bb.v;
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1;i <= n; i++)
for (int j = 1; j <= m; j++) cin>>a[i].a[j];
for (int i = 1; i <= n; i++) scanf("%d", &a[i].v);
sort(a + 1, a + n + 1, cmp);
int ans1 = 0, ans2 = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (fabs(a[i].a[j]) > eps) {
if (!f[j]) {
f[j] = i;
ans1++;
ans2 += a[i].v;
break;
}
else {
Ld x = a[i].a[j] / a[f[j]].a[j];
for (int k = j; k <= m; k++)
a[i].a[k] -= a[f[j]].a[k] * x;
}
}
printf("%d %d\n", ans1, ans2);
}