#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <cstring>
#include <set>
#include <cmath>
#include <map>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int MN = 65005;
const int MAXN = 1000005;
const int INF = 0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false);
int n, m;
int s[25];
int ans;
int tot;
int kick;
int rec[25];
bool f[MAXN];
void dp() {
memset(f, false, sizeof(f));
f[0] = true;
tot = 0;
int an = 0;
for (int i = 1; i <= n; i++) {
if (rec[i])
continue;
for (int j = tot; j >= 0; j--) {
if (f[j] && !f[j + s[i]]) {
f[j + s[i]] = true;
an++;
}
}
tot += s[i];
}
ans = max(an, ans);
//printf("%d\n", ans);
}
void dfs(int step, int kind) {
if (step > kick) {
return;
}
if (kind == n + 1) {
if (step == kick) {
dp();
}
return;
}
dfs(step, kind + 1);
rec[kind] = 1;
dfs(step + 1, kind + 1);
rec[kind] = 0;
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", s + i);
}
kick = m;
dfs(0, 1);
printf("%d", ans);
return 0;
}
P1441 砝码称重(dfs+dp)
最新推荐文章于 2024-07-24 22:13:06 发布