找不到哪里错(恼
#include <bits/stdc++.h>
using namespace std;
inline int read()
{
int s = 0, w = 1;char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-') w = -1;ch = getchar();}
while(ch >= '0' && ch <= '9'){s = s * 10 + ch - '0';ch = getchar();}
return s * w;
}
int T, n, a[16], ans = 0x3f3f3f;
inline void dfs(int step, int sum)
{
if(step > ans) return ;
if(sum > n) return ;
if(sum == n)
{
ans = min(step, ans);
return ;
}
for(int i = 2;i <= 15;i ++)
{
if(a[i] >= 4)
{
a[i] -= 4;
for(int j = 2;j <= 15;j ++)
{
if(i == j) continue;
if(a[j] >= 1)
{
a[j] -= 1;
for(int k = 2;k <= 15;k ++)
{
if(k == i) continue;
if(a[k] >= 1)
{
a[k] --;
dfs(step + 1, sum + 6);
a[k] ++;
}
}
a[j] ++;
}//四带二
if(a[j] >= 2 && j != 15)
{
a[j] -= 2;
for(int k = 2;k <= 14;k ++)
{
if(k == i) continue;
if(a[k] >= 2)
{
a[k] -= 2;
dfs(step + 1, sum + 8);
a[k] += 2;
}
}
a[j] += 2;//四带二对
}
}
dfs(step + 1, sum + 4);//炸弹
a[i] += 4;
}
if(i != 2 && i != 15)
{
if(a[i] >= 3)
{
a[i] -= 3;
int x = 0, y = 1;
for(int j = i + 1;j <= 14;j ++)
{
x ++;
if(a[j] >= 3 && x == y)
{
y ++;
a[j] -= 3;
dfs(step + 1, sum + 3 + x * 3);
a[j] += 3;
}
if(x != y) break;
}
a[i] += 3;//三顺子
}
else if(a[i] >= 2)
{
a[i] -= 2;
int x = 0, y = 1;
for(int j = i + 1;j <= 14;j ++)
{
x ++;
if(a[j] >= 2 && x == y)
{
y ++;
a[j] -= 2;
dfs(step + 1, sum + 2 + x * 2);
a[j] += 2;
}
if(x != y) break;
}
a[i] += 2;//双顺子
}
else if(a[i])
{
a[i] --;
int x = 0, y = 1;
for(int j = i + 1;j <= 14;j ++)
{
x ++;
if(a[j] >= 1 && x == y)
{
y ++;
a[j] --;
dfs(step + 1, sum + 1 + x);
a[j] ++;
}
if(x != y) break;
}
a[i] ++;//单顺子
}
}
if(a[i] >= 3)
{
a[i] -= 3;
for(int j = 2;j <= 14;j ++)
{
if(i == j) continue;
if(a[j] >= 2)
{
a[j] -= 2;
dfs(step + 1, sum + 5);
a[j] += 2;//三带二
}
if(a[j] >= 1)
{
a[j] --;
dfs(step + 1, sum + 4);
a[j] ++;//三带一
}
}
dfs(step + 1, sum + 3);//三张牌
a[i] += 3;
}
if(a[i] >= 2)
{
a[i] -= 2;
dfs(step + 1, sum + 2);
a[i] += 2;
}//对子
if(a[i] >= 1)
{
a[i] --;
dfs(step + 1, sum + 1);
a[i] ++;
}//单张
}
}
int main()
{
T = read(), n = read();
while(T --)
{
for(int i = 1;i <= n;i ++)
{
int x = read(), y = read();
if(x == 0) a[15] ++;
else if(x == 1) a[14] ++;
else a[x] ++;
}
dfs(0, 0);
cout << ans << endl;
for(int i = 1;i <= 15;i ++) a[i] = 0;
ans = 0x3f3f3f;
}
return 0;
}