附借鉴的代码
http://www.cnblogs.com/zbtrs/p/5766051.html
#include <bits/stdc++.h>
using namespace std;
const int maxn = 25;
int a[maxn], num[maxn];
int n, t, ans;
int chupai()
{
memset(num, 0, sizeof(num));
for (int i = 0; i <= 13; i++)
num[a[i]]++;
int tot = 0;
while (num[4] && num[2] > 1)// 4+2对子
{
num[4]--;
num[2] -= 2;
tot++;
}
while (num[4] && num[1] > 1)//4+2单
{
num[4]--;
num[1] -= 2;
tot++;
}
while (num[4] && num[2])//4+1对子
{
num[4]--;
num[2]--;
tot++;
}
while (num[3] && num[2])//3+1对子
{
num[3]--;
num[2]--;
tot++;
}
while (num[3] && num[1])//3+1单
{
num[3]--;
num[1]--;
tot++;
}
return tot + num[1] + num[2] + num[3] + num[4];//不计顺的最少出牌数
}
void dfs(int step)
{
if (step >= ans) //剪枝
return;
int temp = chupai(); //初始值
if (temp + step < ans)
ans = temp + step; //更新
for (int i = 2; i <= 13; i++)
{
int j = i;
while (a[j] >= 3) // 三顺子
j++;
if (j - i >= 2)
{
for (int j2 = i + 1; j2 <= j - 1; j2++)
{
for (int k = i; k <= j2; k++)
a[k] -= 3;
dfs(step + 1);
for (int k = i; k <= j2; k++)
a[k] += 3;
}
}
}
for (int i = 2; i <= 13; i++)
{
int j = i;
while (a[j] >= 2) //二顺子
j++;
if (j - i >= 3)
{
for (int j2 = i + 2; j2 <= j - 1; j2++)
{
for (int k = i; k <= j2; k++)
a[k] -= 2;
dfs(step + 1);
for (int k = i; k <= j2; k++)
a[k] += 2;
}
}
}
for (int i = 2; i <= 13; i++)
{
int j = i;
while (a[j] >= 1) //五单牌顺子
j++;
if (j - i >= 5)
{
for (int j2 = i + 4; j2 <= j - 1; j2++)
{
for (int k = i; k <= j2; k++)
a[k]--;
dfs(step + 1);
for (int k = i; k <= j2; k++)
a[k]++;
}
}
}
}
int main()
{
cin>>t>>n;
while (t--)
{
memset(a, 0, sizeof(a));
for (int i = 1; i <= n; i++)
{
int x, y;
cin>>x>>y;
if (x == 1) //转换A
x = 13;
else
if (x)
x--;
a[x]++;
}
ans = 24;
dfs(0);
cout<<ans;
}
return 0;
}