题目(1)
思路
因为D才15,所以我们暴力枚举。时间复杂度为O($C_D^K$)。
每选出K个数便将所有情况枚一遍。如果出现不符合的变将ans - -,inf存最优解。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int n,ans,d,k,inf=-0x3f3f3f,use[16],b[16]; bool a[1001][16],flag[16]; void dfs(int x) { for(int i=use[x-1]+1;i<=d;i++) if(flag[i]==false) { flag[i]=true; use[x]=i; if(x==k) { for(int j=1;j<=n;j++) { for(int i1=1;i1<=d;i1++) if(a[j][i1]==true&&flag[i1]==false) { ans--; break; } } if(ans>inf) inf=ans; ans=n; } else dfs(x+1); flag[i]=false; use[x]=0; } } int main() { memset(use,0,sizeof(use)); memset(flag,false,sizeof(flag)); scanf("%d%d%d",&n,&d,&k); ans=n; for(int i=1;i<=n;i++) { scanf("%d",&a[0][0]); for(int j=1;j<=a[0][0];j++) { scanf("%d",&b[i]); a[i][b[i]]=true; } } dfs(1); printf("%d",inf); return 0; }