#include<bits/stdc++.h>
#define int long long
#define _for(i, a, b) for(int i = a;i < b;++i)
#define _rep(i, a, b) for(int i = a;i <= b;++i)
int readll(){int x; scanf("%lld", &x); return x;}
using namespace std;
const int maxn = 20 + 5;
#define INF 0x3f3f3f3f
bool flag[maxn];
int _min, M, _count;
void dfs(int a[], int n, int cost){
if(cost > M) return;
if(cost == M){
_min = min(_min, _count);
return;
}
for(int i = n - 1;i >= 0;--i){
if(cost + a[i] * (i + 1) < M) break;
if(flag[i]) continue;
cost += a[i];
flag[i] = true;
++_count;
dfs(a, n, cost);
cost -= a[i];
flag[i] = false;
--_count;
}
}
signed main(){
while(scanf("%lld", &M) == 1){
memset(flag, false, sizeof(flag));
_min = INF; _count = 0;
int N;
N = readll();
int * a = new int[N];
_for(i, 0, N) a[i] = readll();
dfs(a, N, 0);
if(_min != INF) printf("%lld\n", _min);
else printf("0\n");
}
return 0;
}
dfs加剪纸解决



京公网安备 11010502036488号