/*
ID: cm750621
PROG: holstein
LANG: C++
*/
#include <cstdio>
#include <cstdlib>
int book[27],mark[17],stad[27],a[17][27],n,v,min=10000,min_mark[17],ans=0;
void put_in(int x){
for(int i=1;i<=v;i++)
book[i]+=a[x][i];
mark[x]=1;
ans++;
return;
}
void put_out(int x){
for(int i=1;i<=v;i++)
book[i]-=a[x][i];
mark[x]=0;
ans--;
return;
}
int pd(){
for(int i=1;i<=v;i++)
if(book[i]<stad[i])
return 0;
return 1;
}
void copy_ans(int x){
min=x;
for(int i=1;i<=n;i++)
min_mark[i]=mark[i];
}
void dfs(int step){
if(pd() && ans<min){
copy_ans(ans);
return;
}
if(step==n+1)
return;
put_in(step+1);
dfs(step+1);
put_out(step+1);
dfs(step+1);
}
int main(){
freopen("holstein.in","r",stdin);
freopen("holstein.out","w",stdout);
scanf("%d",&v);
int i,j;
for(i=1;i<=v;i++)
scanf("%d",&stad[i]);
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=v;j++)
scanf("%d",&a[i][j]);
put_in(1);
dfs(1);
put_out(1);
dfs(1);
printf("%d ",min);
int sum=0;
for(i=1;i<=n;i++)
if(min_mark[i]){
sum++;
printf("%d",i);
if(sum!=min)
printf(" ");
}
printf("\n");
return 0;
}
usaco 2.1.4 holstein
最新推荐文章于 2020-03-09 20:15:04 发布