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;
}
时间: 2024-11-08 22:50:50

USACO Healthy Holsteins DFS的相关文章

usaco Healthy Holsteins

题意为有一头牛,它每天所需的维生素有V种,每种维生素的需求量给出,同时给出G种已知的饲料,求如何组合这些饲料可以使得牛获得足够的维生素: 给的数据范围很小,直接暴力枚举所有 /* ID: modengd1 PROG: holstein LANG: C++ */ #include <iostream> #include <stdio.h> #include <memory.h> using namespace std; int V,G,food[15][1000],cow

USACO Section 2.1 Healthy Holsteins

/* ID: lucien23 PROG: holstein LANG: C++ */ #include <iostream> #include <fstream> #include <vector> using namespace std; bool compFun(int x, int y) { int temp, i = 0; while (true) { temp = 1 << i; if (temp&x > temp&y) {

2.1.4 Healthy Holsteins 健康的好斯坦奶牛

2.1.4 Healthy Holsteins 健康的好斯坦奶牛 一.题目描述 农民JOHN以拥有世界上最健康的奶牛为傲.他知道每种饲料中所包含的牛所需的最低的维他命量是多少.请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数最少. 给出牛所需的最低的维他命量,输出喂给牛需要哪些种类的饲料,且所需的饲料剂量最少. 维他命量以整数表示,每种饲料最多只能对牛使用一次,数据保证存在解. PROGRAM NAME: holstein INPUT FORMAT 第1 行:一个整数V(1<=V<

USACO Section2.1 Healthy Holsteins 解题报告 【icedream61】

holstein解题报告 ------------------------------------------------------------------------------------------------------------------------------------------------[题目] 你需要给一头奶牛制定最优的喂养计划. 有V种维他命,每天对于每种维他命,牛都有需要达到的指标: 同时你有G种饲料,编号依次为1到G,每种维他命在每种饲料中所蕴含的量都会给你.

【USACO 2.1】Healthy Holsteins

/* TASK: holstein LANG: C++ URL: http://train.usaco.org/usacoprob2?a=SgkbOSkonr2&S=holstein SOLVE: con[i][j]为食物i含有维生素j的量,ned[i]为需要的维生素i的量 bfs,用二进制保存状态 */ #include<cstdio> #define N 30 int v,g,ned[N],con[N][N]; int now[N]; int l,r,q[40000]; bool

USACO-Section 2.1 Healthy Holsteins (状态压缩DFS)

描述 农民JOHN以拥有世界上最健康的奶牛为傲.他知道每种饲料中所包含的牛所需的最低的维他命量是多少.请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数最少. 给出牛所需的最低的维他命量,输出喂给牛需要哪些种类的饲料,且所需的饲料剂量最少. 维他命量以整数表示,每种饲料最多只能对牛使用一次,数据保证存在解. 格式 PROGRAM NAME: holstein INPUT FORMAT: (file holstein.in) 第1行:一个整数V(1<=V<=25),表示需要的维他命的

[USACO][枚举]Healthy Holsteins

这道题看起来背包其实是二进制枚举哒! 题意: 一包饲料有三种营养素含量,要求搭配饲料使得每种营养素累加之和不小于目标值.给出研究的营养素种类数目.每种营养素的目标值.备选饲料数目,以及每种饲料的营养素含量,求出最少选取多少饲料可以满足要求.(每个规格的饲料只能用一次) 遇到的问题: * cpp重载运算符+我透啊好迷惑!找时间补补郭伟......* 问题都是简单的,不要总想着自己不会的东西,只要动脑一定可以解决!!* 呃...ostream&重载又又又忘记return os了......* 本题看

洛谷P1460 健康的荷斯坦奶牛 Healthy Holsteins

题目描述 农民JOHN以拥有世界上最健康的奶牛为傲.他知道每种饲料中所包含的牛所需的最低的维他命量是多少.请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数最少. 给出牛所需的最低的维他命量,输出喂给牛需要哪些种类的饲料,且所需的饲料剂量最少. 维他命量以整数表示,每种饲料最多只能对牛使用一次,数据保证存在解. 输入输出格式 输入格式: 第1行:一个整数V(1<=V<=25),表示需要的维他命的种类数. 第2行:V个整数(1<=每个数<=1000),表示牛每天需要的每种

USACO Hamming Codes DFS 构造

我还是用了很朴素的暴力匹配A了这题,不得不感叹USACO时间放的好宽... /* ID: wushuai2 PROG: hamming LANG: C++ */ //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> #include <iostream> #include <fstream> #include <cstring>