```
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 2010;
const int maxm = 30;
int n, m, a[maxm], ans;
bool f[maxn];
bool vis[maxm];
void dfs(int k,int last)//k表示取了多少个
{
if (k == m + 1)//拿走了m个,必须制裁
{
memset(f, 0, sizeof(f));
f[0] = 1;
for (int i = 1; i <= n; i++)
if (!vis[i])//没被拿走
for (int j = 2000; j >= 0; j--)
if(j + a[i] <= 2000)//太大了可不行
f[j + a[i]] = f[j+a[i]]|f[j];//嘎嘎标记
int num = 0;
for (int i = 1; i <= 2000; i++)
num += f[i];
ans = max(ans, num);
return;
}
for (int i = last + 1; i <= n; i++)
{
vis[i] = 1;//标记为拿走了
dfs(k + 1, i);
vis[i] = 0;//回首掏
}
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
dfs(1, 0);
cout << ans;
}
```
已A代码,改了“嘎嘎标记”那一行。
不能直接等于,因为```f[j+a[i]]```可能本来是1,目前找到的这种方法可能不行,但还是可以组成``j+a[i]``这个数。
~~注:别问我是怎么知道的,我也掉坑里了[哭] · · · · · ·~~
by doris_xyb @ 2023-02-04 20:00:22