简单的dfs题:

 

 

 1/*
 2ID: mercury2
 3LANG: C++
 4PROG: holstein
 5*/

 6
 7#include <iostream>
 8
 9using namespace std;
10
11int m,n,t;
12int v[30],vi[30][30],vn[30];
13int total,p[30],ni[30];
14bool s[30];
15
16bool check(){
17     for (int i = 0; i < m; i++){
18         if(p[i] < v[i]) return false;
19         }

20     return true;
21}

22
23void search(int k,int depth){     
24     if(check() && depth < total){
25                total = depth;
26                t = 0;
27                for (int i = 0; i < n; i++if(s[i]) ni[t++= i+1;
28//                for (int i = 0; i < m; i++) cout << p[i] << " ";
29//                cout << total << endl;
30                return;
31                }

32
33     for (int i = k+1;i < n; i++){
34        for (int j = 0; j < m; j++) p[j]+=vi[i][j];
35        s[i] = true;
36        search(i,depth+1);
37        for (int j = 0; j < m; j++) p[j]-=vi[i][j];
38        s[i] = false;
39     }

40}

41
42int main(){
43    freopen("holstein.in","r",stdin);
44    freopen("holstein.out","w",stdout);
45    
46    cin >> m;
47    for (int i = 0; i < m; i++) cin >> v[i];
48    cin >> n;
49    for (int i = 0; i < n; i++)
50        for (int j = 0; j < m; j++
51        cin >> vi[i][j];
52    
53    total = 100;
54    memset(vn,0,sizeof(vn));
55    memset(p,0,sizeof(p));
56    memset(s,false,sizeof(s));
57    
58    
59    for (int i = 0; i < n; i++){
60        for (int j = 0; j < m; j++) p[j]+=vi[i][j];
61        s[i] = true;
62        search(i,1);
63        for (int j = 0; j < m; j++) p[j]-=vi[i][j];
64        s[i] = false;
65        }

66
67    cout << total <<" ";
68    
69    t = 0;
70    
71    for (int i = 0; i < total-1; i++) cout << ni[i] <<" ";
72    cout << ni[total-1<< endl;
73    
74    return 0;
75}

76 
77
posted on 2008-08-29 09:45  vector  阅读(338)  评论(0编辑  收藏  举报