POJ2220+DFS
题意:给出n个宝物,m个寻宝人。
每个寻宝人对n个宝物都有一个估价。
从这些估价中挑出某些,是的价值差最小。
dfs。。没什么好说的,暴力枚举!
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 搜索+枚举 3 */ 4 #include<stdio.h> 5 #include<string.h> 6 #include<stdlib.h> 7 #include<algorithm> 8 using namespace std; 9 10 const int Max = 0x7fffffff; 11 struct Node{ 12 int val[ 10 ]; 13 }a[ 10 ]; 14 struct Node2{ 15 int num[ 10 ]; 16 int cnt ,sum ; 17 }ans[ 10 ],dfs_ans[ 10 ]; 18 int vis[ 10 ]; 19 int diff; 20 bool flag[ 10 ]; 21 22 void init(){ 23 diff = Max; 24 memset( flag,false,sizeof( flag ) ); 25 //memset( vis,0,sizeof( vis ) ); 26 for( int i=0;i<10;i++ ){ 27 for( int j=0;j<10;j++ ){ 28 //a[ i ].val[ j ] = 0; 29 ans[ i ].num[ j ] = dfs_ans[ i ].num[ j ] = 0; 30 } 31 ans[ i ].cnt = ans[ i ].sum = dfs_ans[ i ].cnt = dfs_ans[ i ].sum = 0; 32 } 33 } 34 35 void init_vis( int n ){ 36 int N = (1<<n); 37 for( int i=0;i<N;i++ ){ 38 for( int j=0;j<n;j++ ){ 39 if( i&(1<<j) ) vis[ j ] = 0; 40 else vis[ j ] = 1; 41 //printf("%d",vis[j]); 42 } 43 //printf("\n"); 44 } 45 } 46 47 void dfs( int cur_hunter,int cur_treasure,int num_treasure,int hunter ){ 48 if( cur_hunter==hunter&&cur_treasure==num_treasure ){ 49 int t_max = dfs_ans[0].sum; 50 int t_min = dfs_ans[0].sum; 51 for( int i=1;i<hunter;i++ ){ 52 t_max = max( t_max,dfs_ans[i].sum ); 53 t_min = min( t_min,dfs_ans[i].sum ); 54 } 55 if( t_max-t_min<diff ){ 56 diff = t_max-t_min; 57 for( int i=0;i<hunter;i++ ) 58 ans[i] = dfs_ans[i]; 59 } 60 return ; 61 } 62 if( cur_hunter>=hunter ) return ; 63 int N = (1<<num_treasure); 64 for( int i=0;i<N;i++ ){ 65 int t_cnt = 0; 66 bool p_flag = true; 67 for( int j=0;j<num_treasure;j++ ){ 68 if( i&(1<<j) ) vis[ j ] = 0; 69 else { 70 vis[ j ] = 1; 71 t_cnt++; 72 if( flag[j]==true ) { 73 p_flag = false; 74 break; 75 } 76 } 77 } 78 if( /*t_cnt!=0&&*/p_flag==true&&( t_cnt+cur_treasure+hunter-cur_hunter-1 )<=num_treasure ){ 79 int tt = 0; 80 dfs_ans[ cur_hunter ].sum = 0; 81 dfs_ans[ cur_hunter ].cnt = t_cnt; 82 for( int j=0;j<num_treasure;j++ ){ 83 if( vis[j] == 1 ){ 84 dfs_ans[ cur_hunter ].num[ tt++ ] = j; 85 flag[ j ] = true; 86 dfs_ans[ cur_hunter ].sum += a[ cur_hunter ].val[j]; 87 } 88 } 89 dfs( cur_hunter+1,cur_treasure+t_cnt,num_treasure,hunter); 90 for( int j=0;j<tt;j++ ){ 91 flag[ dfs_ans[ cur_hunter ].num[j] ] = false; 92 } 93 } 94 } 95 return ; 96 } 97 98 int main(){ 99 int num_treasure,hunter; 100 char s[ 12 ]; 101 int ca = 1; 102 //freopen("out.txt","w",stdout); 103 while( scanf("%s",s)!=EOF ){ 104 init(); 105 scanf("%d%d",&num_treasure,&hunter);//宝藏,寻宝人 106 for( int i=0;i<hunter;i++ ){ 107 for( int j=0;j<num_treasure;j++ ){ 108 scanf("%d",&a[i].val[j]); 109 } 110 } 111 scanf("%s",s); 112 if( num_treasure==1 ){ 113 int m_min = a[0].val[0]; 114 int m_num = 0; 115 for( int i=1;i<hunter;i++ ){ 116 if( m_min>a[i].val[0] ){ 117 m_min = a[ i ].val[0]; 118 m_num = i; 119 } 120 } 121 if( ca!=1 ) printf("\n"); 122 ca++; 123 for( int i=0;i<hunter;i++ ){ 124 if( i==m_num ){ 125 printf("1 %d\n",m_min); 126 } 127 else 128 printf("0\n"); 129 } 130 continue; 131 } 132 dfs( 0,0,num_treasure,hunter ); 133 if( ca!=1 ) printf("\n"); 134 ca++; 135 for( int i=0;i<hunter;i++ ){ 136 for( int j=0;j<ans[i].cnt;j++ ){ 137 if( j==0 ) 138 printf("%d",ans[i].num[j]+1); 139 else 140 printf(" %d",ans[i].num[j]+1); 141 } 142 if( ans[i].cnt>0 ) printf(" %d\n",ans[i].sum); 143 else printf("%d\n",ans[i].sum); 144 } 145 } 146 return 0; 147 }
keep moving...