巨水。。。直接回溯暴力居然过了。。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <algorithm> #include <cstring> #include <cstdio> #define N 110 char s[6][5]= {"XXL","XL","L","M","S","XS"}; int solve(char *str) { for(int i=0; i<6; ++i) if(!strcmp(str,s[i])) return i; } struct dat { int u,v; } ans[N]; int n,m; int vis[N],num[N]; bool dfs(int cur) { if(cur==m) { for(int i=0; i<m; ++i) if(num[i]>n) return false; return true; } int u=ans[cur].u; int v=ans[cur].v; num[u]++; if(num[u]>n) num[u]--; else { if(dfs(cur+1)) return true; num[u]--; } num[v]++; if(num[v]>n) num[v]--; else { if(dfs(cur+1)) return true; num[v]--; } return false; } int main() { int t; scanf("%d",&t); while(t--) { char str[8],s2[8]; scanf("%d %d",&n,&m); for(int i=0; i<m; ++i) { scanf("%s %s",str,s2); ans[i].u=solve(str); ans[i].v=solve(s2); } memset(num, 0, sizeof(num)); n/=6; if(dfs(0)) { puts("YES"); } else { puts("NO"); } } return 0; }