80分求调
查看原帖
80分求调
683031
JOEYyyyyfuck楼主2024/4/3 15:08
#include<iostream>
#include<string>
#include<stdio.h>
#include<cstring>
#include<ctype.h>
#include<algorithm>
#include<cmath>
using namespace std;
int n, m;
bool del[25];
int a[25];
int f[25000];
int can_reach, result, ans;
int max(int x, int y)
{
	return x > y ? x : y;
}

void dp()
{
	memset(f, 0, sizeof(f));
	f[0] = 1;
	can_reach = 0;
	ans = 0;
	for (int i = 1; i <= n; i++)
	{
		if (del[i] == 1) continue;
		for (int j = can_reach; j >= 0; j--)
		{
			if (f[j] && !f[j + a[i]])
			{
				f[j + a[i]] = 1;
				ans++;
			}
		}
		can_reach += a[i];
	}
	result = max(ans, result);
	printf("ret=%d\n", result);
}

void dfs(int now,int has_dele)
{
	if (now > n || has_dele > m) return;
	if (has_dele == m)
	{
		dp();
	}
	else
	{
		del[now] = 1;
		dfs(now + 1, has_dele + 1);
		del[now] = 0;
		dfs(now + 1, has_dele);
	}
}

int main()
{
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
	//sort(a + 1, a + 1 + n);
	dfs(1, 0);
	printf("%d", result);
	return 0;
}
2024/4/3 15:08
加载中...