the reason of failure:1、0/1问题取的值是哪一个是需要注意的。
thinking:直接0/1枚举全部
代码:
/*
ID: me
PROG: holstein
LANG: C++
*/
#include<iostream>
#include <math.h>
#include <stdio.h>
#include <string.h>
using namespace std;
int qq[500][30];
int a1[30];
bool walked[500];
bool tt[30];
int b1[30];
int main(){
freopen("holstein.in","r",stdin);
freopen("holstein.out","w",stdout);
memset(walked,0,sizeof(walked));
memset(qq,0,sizeof(qq));
int i,j,k,f1,f2,t1,t2,n,m;
int t3,t4;
cin >> n;
for(i=0;i<n;i++)
cin >> a1[i];
cin >> m;
int max1=9999;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin >> qq[i][j];
for(int t=0;t<pow(2,m);t++){
for(i=0;i<m;i++) // 1、到底0、1是取哪一个
if(walked[i]==0){
walked[i]=1;
break;
}else{
walked[i]=0;
}
/*for(i=0;i<n;i++)
cout << walked[i] << " ";
cout << endl;*/
memset(b1,0,sizeof(b1));
int gg=0;
for(j=0;j<m;j++){
if(walked[j]==1){
for(k=0;k<n;k++){
b1[k]+=qq[j][k];
}
gg++;
}
}
/*for(i=0;i<n;i++)
cout << b1[i] <<" ";
cout << endl;*/
j=0;
while(b1[j]>=a1[j]){
j++;
if(j==n){
if(gg<max1){
// cout << "gg=" << gg << endl;
memset(tt,0,sizeof(tt));
for(i=0;i<m;i++)
if(walked[i]==1){
// cout <<i << endl;
tt[i]=1;}
max1=gg;
}
break;
}
}
}
cout << max1;
for(i=0;i<m;i++) //还是0、1选哪个的问题
if(tt[i]==1)cout << " " << i+1;
cout << endl;
return 0;
}