可以转成动态规划问题,f[i][j][k][0/1]表示选完了前i种牌,第i-1种选了j个,第i种选了k个,选/不选一对的。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int T;bool f[105][105][105][2];int a[105];
int main() {
scanf("%d",&T);
while(T--) {
memset(f,0,sizeof f);
f[0][0][0][0]=1;
for(int i=1;i<=100;i++) scanf("%d",&a[i]);
for(int i=1;i<=100;i++) {
for(int j=0;j<=a[i-1];j++) {
for(int k=0;k<=a[i];k++) {
if(k>1)f[i][j][k][1]|=f[i][j][k-2][0];
if(k>2)f[i][j][k][1]|=f[i][j][k-3][1],f[i][j][k][0]|=f[i][j][k-3][0];
if(k>3)f[i][j][k][1]|=f[i][j][k-4][1],f[i][j][k][0]|=f[i][j][k-4][0];
if(j>=k&&a[i-2]>=k) f[i][j][k][0]|=f[i-1][a[i-2]-k][j-k][0],f[i][j][k][1]|=f[i-1][a[i-2]-k][j-k][1];
}
}
}
puts(f[100][a[99]][a[100]][1]?"Yes":"No");
}
}