POJ2220+DFS

题意:给出n个宝物,m个寻宝人。

每个寻宝人对n个宝物都有一个估价。

从这些估价中挑出某些,是的价值差最小。

dfs。。没什么好说的,暴力枚举!

  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 }
View Code

 

 

posted @ 2013-07-19 21:42  xxx0624  阅读(300)  评论(0编辑  收藏  举报