进食后人(if(You_WA_On_最后一个点 == true))
查看原帖
进食后人(if(You_WA_On_最后一个点 == true))
1136033
Xu_Jinyi_2011楼主2025/1/17 10:44

最好把往后跳的步骤预处理一下。具体参见第一篇题解,楼主讲的非常详细。

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

int n, m;
int a[1000], ne[1000];
bool vis[1000];
int sum = 0, maxa = 0;

bool cmp(int a, int b) {
	return a > b;
}

inline bool dfs(int num, int y, int last) {
	if (num * m == sum) return true;
	if (y == m) return dfs(num + 1, 0, 0);
	for (int i = last; i < n; i ++) {
		if (vis[i] == false && a[i] <= m - y) {
			vis[i] = true;
			if (dfs(num, y + a[i], i + 1)) return true;
			vis[i] = false;
			if (y == 0) return false;
			if (a[i] == m - y) return false;
//			int j = i;
//			while (a[j] == a[i] && j < n) j ++;
//			i = j - 1;
			i = ne[a[i]];
		}
	}
	return false;
}

int main() {
	ios::sync_with_stdio(false);
	cin >> n;
	for (int i = 0; i < n; i ++) {
		cin >> a[i];
		sum += a[i];
		maxa = max(maxa, a[i]);
	}
	stable_sort(a, a + n, cmp);
	for (int i = 0; i < n; i ++) {
		if (a[i] != a[i + 1]) ne[a[i]] = i;
	}
	for (int i = maxa; i <= sum; i ++) {
		if (sum % i == 0) {
			m = i;
			memset(vis, 0, sizeof vis);
			if (dfs(0, 0, 0)) {
				cout << i << '\n';
				break;
			}
		}
	}
	return 0;
}
2025/1/17 10:44
加载中...