但是开大了原本A掉的点就会TLE。
代码如下:
#include <bits/stdc++.h>
using namespace std;
#define MAXN 101
int v, n, k;
int a[MAXN], use[MAXN];
bitset<10002> f;
void dfs(int now){
for (int i=use[now-1]+1; i<=n-k+now; i++){
use[now] = i;
if (now == k){
f.reset();
f[0] = true;
for (int i=1; i<=k; i++){
for (int j=1; j<=v/a[use[i]]; j++) f[j*a[use[i]]] = true;
}
for (int i=1; i<=k; i++){
for (int j=a[use[i]]; j<=v; j++) f[j] = f[j] || f[j-a[use[i]]];
}
if (f[v]){
cout << k << ' ';
for (int i=1; i<=k; i++) cout << a[use[i]] << ' ';
exit(0);
}
}else{
dfs(now+1);
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> v >> n;
for (int i=1; i<=n; i++) cin >> a[i];
sort(a+1, a+n+1);
for (k=1; k<=n; k++) dfs(1);
return 0;
}