简单的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
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