asd

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

const int N = 30;

int T, n;
int a[N];
int ans;

void dfs(int now) {
	if(now >= ans) return;
	int cnt = 0;
	for(int i = 3; i <= 14; ++i) { //单顺子
		if(a[i] == 0)/*<1*/ cnt = 0;
		else {
			cnt++;
			if(cnt >= 5) {
				for(int j = i; j >= i - cnt + 1; --j) a[j]--;
				dfs(now + 1);
				for(int j = i; j >= i - cnt + 1; --j) a[j]++;
			}
		}
	}
	cnt = 0;
	for(int i = 3; i <= 14; ++i) { //双顺子
		if(a[i] <= 1) cnt = 0;
		else {
			cnt++;
			if(cnt >= 3) {
				for(int j = i; j >= i - cnt + 1; --j) a[j] -= 2;
				dfs(now + 1);
				for(int j = i; j >= i - cnt + 1; --j) a[j] += 2;
			}
		}
	}
	cnt = 0;
	for(int i = 3; i <= 14; ++i) { //三顺子
		if(a[i] <= 2) cnt = 0;
		else {
			cnt++;
			if(cnt >= 2) {
				for(int j = i; j >= i  - cnt + 1; --j) a[j] -= 3;
				dfs(now + 1);
				for(int j = i; j >= i  - cnt + 1; --j) a[j] += 3;
			}
		}
	}
	for(int i = 2; i <= 14; ++i) {
		if(a[i] <= 3) {
			if(a[i] <= 2) continue;

			a[i] -= 3;
			for(int j = 2; j <= 15; ++j) {
				if(a[j] <= 0 || j == i) continue;
				a[j]--;
				dfs(now + 1);
				a[j]++;
			}

			for(int j = 2; j <= 14; ++j) {
				if(a[j] <= 1 || j == i) continue;
				a[j] -= 2;
				dfs(now + 1);
				a[j] += 2;
			}
			a[i] += 3;
		} else {
			a[i] -= 3;
			for(int j = 2; j <= 15; ++j) {
				if(a[j] < 1 || j == i) continue;
				a[j]--;
				dfs(now + 1);
				a[j]++;
			}

			for(int j = 2; j <= 14; ++j) {
				if(a[j] < 2 || j == i) continue;
				a[j] -= 2;
				dfs(now + 1);
				a[j] += 2;
			}
			a[i] += 3;

			a[i] -= 4;
			for(int j = 2; j <= 15; ++j) {
				if(a[j] <= 0 || j == i) continue;
				a[j]--;
				for(int k = 2; k <= 15; ++k) {
					if(a[k] <= 0) continue;
					a[k]--;
					dfs(now + 1);
					a[k]++;
				}
				a[j]++;
			}

			for(int j = 2; j <= 14; ++j) {
				if(a[j] <= 1 || j == i) continue;
				a[j] -= 2;
				for(int k = 2; k <= 14; ++k) {
					if(a[k] <= 1) continue;
					a[k] -= 2;
					dfs(now + 1);
					a[k] += 2;
				}
				a[j] += 2;
			}
			a[i] += 4;
		}
	}
	for(int i = 2; i <= 15; ++i) if(a[i]) now++;
	ans = min(ans, now);
	return;
}

int main() {
	//freopen("a.in", "r", stdin);
	scanf("%d%d", &T, &n);
	while(T--) {
		ans = 0x7fffffff;
		memset(a, 0, sizeof(a));
		int x, y;
		for(int i = 1; i <= n; ++i) {
			scanf("%d%d", &x, &y);
			if(x == 0) a[15]++;
			else if(x == 1) a[14]++;
			else a[x]++;
		}
		dfs(0);
		cout << ans << '
';
	}
	return 0;
}

原文地址:https://www.cnblogs.com/Asmallwave/p/11569341.html