//usaco training-Healthy Holsteins /* * 题目类型:搜索 * 按照饲料种类的数量递增的顺序进行深度搜索 * 搜索时,对于种类i有两种方案(放 和 不放) * 题目要求输出编号小的所以先搜索放的方案 * 设置结束标志sign !!! * tle ac * 求和时处理不当,导致大量耗时 */ /* Compiling... Compile: OK Executing... Test 1: TEST OK [0.000 secs, 3036 KB] Test 2: TEST OK [0.000 secs, 3036 KB] Test 3: TEST OK [0.000 secs, 3036 KB] Test 4: TEST OK [0.000 secs, 3036 KB] Test 5: TEST OK [0.000 secs, 3036 KB] Test 6: TEST OK [0.000 secs, 3036 KB] Test 7: TEST OK [0.000 secs, 3036 KB] Test 8: TEST OK [0.054 secs, 3036 KB] Test 9: TEST OK [0.027 secs, 3036 KB] Test 10: TEST OK [0.783 secs, 3036 KB] All tests OK. */ #include <iostream> #include <stdio.h> #include <string.h> using namespace std; FILE *fin = fopen("holstein.in","r"); FILE *fout = fopen("holstein.out","w"); int v,g,sign; int av[30],ag[30][30],nv[30],sum[30],tmp[30]; void dfs(int maxlen,int tmplen,int u) { int i,j,sum1; if(sign) return ; if(tmplen==maxlen){ memset(sum,0,sizeof(sum)); for(i=0; i!=v; ++i){ for(sum1=j=0; j!=maxlen; ++j) sum1+=ag[nv[j]][i]; if(sum1<av[i]) break; } if(i==v){ for(sign=1,i=0; i!=maxlen; ++i) tmp[i]=nv[i]; } return ; } for(i=u; i!=g; ++i) { nv[tmplen]=i; dfs(maxlen,tmplen+1,i+1); dfs(maxlen,tmplen,i+1); } return ; } int main(void) { int i,j; fscanf(fin,"%d",&v); for(i=0; i!=v; ++i) fscanf(fin,"%d",&av[i]); fscanf(fin,"%d",&g); for(i=0; i!=g; ++i) for(j=0; j!=v; ++j) fscanf(fin,"%d",&ag[i][j]); for(i=1; i<=g; ++i){ dfs(i,0,0); if(sign) break; } fprintf(fout,"%d ",i); for(j=0; j!=i; ++j){ if(j==i-1) fprintf(fout,"%d",tmp[j]+1); else fprintf(fout,"%d ",tmp[j]+1); } fprintf(fout,"/n"); return 0; }