求解一维向量组中的线性无关组的大小
定义f[i][j]表示考虑前i个向量互相组合成为j(恰好)的方案数,再对向量组进行排序,那么对于一个向量a[i]只需要看看知否可以被前面i - 1个向量线性表示(可以无限选择)出来,对应f数组就是:f[i][a[i]] == 1(基于f的表示a[i]可以用a[i]自己表示),表示无法用前面的向量表示,ans++即可
初始化
for (int i = 0; i <= n; i++) f[i][0] = 1; 组成0的方案为1
import java.util.*;
public class Main {
static final int N = 110, M = 25010;
static int[][] f = new int[N][M];
static int[] a = new int[N];
static int n, m;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
while (T -- > 0) {
n = sc.nextInt();
for (int i = 1; i <= n; i++) a[i] = sc.nextInt();
Arrays.sort(a, 1, n + 1);
m = a[n];
for (int i = 0; i <= n; i++) f[i][0] = 1;
int ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= m; j++) {
f[i][j] = f[i - 1][j];
if (j >= a[i])
f[i][j] += f[i][j -a[i]];
}
if (f[i][a[i]] == 1) ans ++;
}
System.out.println(ans);
}
}
}
import java.util.*;
public class Main {
static final int N = 110, M = 25010;
static int[] f = new int[M];
static int[] a = new int[N];
static int n, m;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
while (T -- > 0) {
n = sc.nextInt();
for (int i = 1; i <= n; i++) a[i] = sc.nextInt();
Arrays.sort(a, 1, n + 1);
m = a[n];
/*
这里需要初始化f数组了,如果不进行初始化下面进行状态转移方程会使用到上一次
对f数组的操作,影响答案
二维数组不需要是因为对于f数组(二维有序操作)的操作有一步操作:
f[i][j] = f[i - 1][j]会将上一步的操作进行覆盖,从而不会影响答案
*/
Arrays.fill(f, 0);
f[0] = 1;
int ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= m; j++)
if (j >= a[i])
f[j] += f[j -a[i]];
if (f[a[i]] == 1) ans ++;
}
System.out.println(ans);
}
}
}