复习了一下之前的知识点,练了些搜索题
#include<stdio.h>
int n,w,a[20],b[20],ans;
void dfs(int p,int q){
if(q>=ans) return;
if(p==n){
ans=q;
return;
}
for(int i=0;i<q;i++){
if(b[i]+a[p]<=w){
b[i]+=a[p];
dfs(p+1,q);
b[i]-=a[p];
}
}
b[q]=a[p];
dfs(p+1,q+1);
b[q]=0;
}
int main()
{
scanf("%d %d",&n,&w);
ans=n;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n-1;i++){
for(int j=0;j<n-1-i;j++){
if(a[j]<a[j+1]){
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
dfs(0,0);
printf("%d\n",ans);
return 0;
}
#include<stdio.h>
#include<math.h>
int n,k;
long long a[21],max=0;
void dfs(int x,long long s){
if(x==n){
if(s>max) max=s;
return;
}
dfs(x+1,s^a[x]);
dfs(x+1,s);
}
int main()
{
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++){
int b,c;
scanf("%d",&b);
for(int j=1;j<=b;j++){
scanf("%d",&c);
a[i]+=1LL << (k - c);
}
}
dfs(0,0);
printf("%lld",max);
return 0;
}