题目
题解思路
a中的任意组合都必须用b能表示出来,a表示不了的b也表示不了。
b中的任意元素用b中的另外的无法表示
这不就是 线性代数里的最大无关向量组吗
怎么求
我们可以用完全背包来 弄出体积内能表示的所有 数 并把他们筛去 ,无法表示的数就是最小线性无关组的元素了 。
而且 大数肯定是由小数表达出的
所以 我们从小到大排序 并且按这个顺序 跑完全背包 传递是否可以表示。
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <map>
#include <string>
using namespace std;
const int INF = 0x3f3f3f3f;
int a[110];
int dp[30100];
int main ()
{
ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--)
{
memset(dp , 0 , sizeof(dp) );
int n ;
cin>>n ;
for (int i = 1 ; i <= n ; i++ )
cin>>a[i];
sort( a+1 , a+1+n );
int m = a[n] , res = 0 ;
dp[0] = 1 ;
for (int i = 1 ; i <= n ; i++ )
{
if ( !dp[a[i]] ) res++;
for (int j = a[i] ; j <= m ; j++ )
{
dp[j] |= dp[j - a[i]] ;
}
}
cout<<res<<"\n";
}
return 0 ;
}