USACO Healthy Holsteins DFS

使用排列组合,遍历所有可能的情况C(1)+C(2)+C(3)……C(n)= 2^G种组合

数据规模不大,暴力过去最多也就是2^15 = 23768种情况

所以就暴力咯,不过还是Debug了一会

 

Source Code:

/*

ID: wushuai2

PROG: holstein

LANG: C++

*/

//#pragma comment(linker, "/STACK:16777216") //for c++ Compiler

#include <stdio.h>

#include <iostream>

#include <fstream>

#include <cstring>

#include <cmath>

#include <stack>

#include <string>

#include <map>

#include <set>

#include <list>

#include <queue>

#include <vector>

#include <algorithm>

#define Max(a,b) (((a) > (b)) ? (a) : (b))

#define Min(a,b) (((a) < (b)) ? (a) : (b))

#define Abs(x) (((x) > 0) ? (x) : (-(x)))

#define MOD 1000000007

#define pi acos(-1.0)



using namespace std;



typedef long long           ll      ;

typedef unsigned long long  ull     ;

typedef unsigned int        uint    ;

typedef unsigned char       uchar   ;



template<class T> inline void checkmin(T &a,T b){if(a>b) a=b;}

template<class T> inline void checkmax(T &a,T b){if(a<b) a=b;}



const double eps = 1e-7      ;

const int M = 660000         ;

const ll P = 10000000097ll   ;

const int INF = 0x3f3f3f3f   ;

const int MAX_N = 20         ;

const int MAXSIZE = 101000000;



int vv[30], aa[20][30];

int ans[30], a[30], cur[30];

int v, g;



void dfs(int n, int w, int a[]){



    int i, j;

    memset(cur, 0, sizeof(cur));

    for(i = 1; i <= a[0]; ++i){

        for(int j = 0; j < v; ++j){

            cur[j] += aa[a[i]][j];

        }

    }

    for(i = 0; i < v; ++i){

        if(cur[i] < vv[i]) break;

    }

    if(i == v){

        if(w < ans[0]){

            /*

            for(int i = 1; i <= a[0]; ++i){

                cout << a[i] + 1 << ' ';

            }

            cout << endl;

            */

            for(i = 0; i <= a[0]; ++i){

                ans[i] = a[i];

            }

            return;

        }

    }

    for(int i = n + 1; i < g; ++i){

        ++a[0];

        a[a[0]] = i;

        dfs(i, w + 1, a);

        --a[0];

    }

}



int main() {

    ofstream fout ("holstein.out");

    ifstream fin ("holstein.in");

    int i, j, k, t, n, s, c, w, q;



    fin >> v;

    for(i = 0; i < v; ++i){

        fin >> vv[i];

    }

    fin >> g;

    for(i = 0; i < g; ++i){

        for(j = 0; j < v; ++j){

            fin >> aa[i][j];

        }

    }

    ans[0] = INF;

    for(i = 0; i < g; ++i){

        a[0] = 1;

        a[1] = i;

        dfs(i, 1, a);

    }

    fout << ans[0];

    for(i = 1; i <= ans[0]; ++i){

        fout << ' ' << ans[i] + 1;

    }

    fout << endl;



    fin.close();

    fout.close();

    return 0;

}

 

你可能感兴趣的:(health)