zoukankan      html  css  js  c++  java
  • 洛谷P1460 健康的荷斯坦奶牛 Healthy Holsteins

    P1460 健康的荷斯坦奶牛 Healthy Holsteins

    •  
    • 168通过
    • 340提交
    • 题目提供者该用户不存在
    • 标签USACO
    • 难度普及-

     提交  讨论  题解  

    最新讨论

    • 2个数据超时,求优化

    题目描述

    农民JOHN以拥有世界上最健康的奶牛为傲。他知道每种饲料中所包含的牛所需的最低的维他命量是多少。请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数最少。

    给出牛所需的最低的维他命量,输出喂给牛需要哪些种类的饲料,且所需的饲料剂量最少。

    维他命量以整数表示,每种饲料最多只能对牛使用一次,数据保证存在解。

    输入输出格式

    输入格式:

    第1行:一个整数V(1<=V<=25),表示需要的维他命的种类数。

    第2行:V个整数(1<=每个数<=1000),表示牛每天需要的每种维他命的最小量。

    第3行:一个整数G(1<=G<=15),表示可用来喂牛的饲料的种数。

    下面G行,第n行表示编号为n饲料包含的各种维他命的量的多少。

    输出格式:

    输出文件只有一行,包括

    牛必需的最小的饲料种数P

    后面有P个数,表示所选择的饲料编号(按从小到大排列)。

    如果有多个解,输出饲料序号最小的(即字典序最小)。

    输入输出样例

    输入样例#1

    4

    100 200 300 400

    3

    50  50  50  50

    200 300 200 300

    900 150 389 399

    输出样例#1

    2 1 3

    说明

    USACO 2.1

    翻译来自NOCOW

    分析:因为每个饲料可以吃也可以不吃,所以想到0-1背包,但是记录状态比较麻烦,而且数据这么小,不妨试试暴搜,可以搜索子集,然后检验是否合适,或者一个饲料一个饲料的搜索,要么选要么不选,注意判断一下就好了.

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int v, a[30], G[16][30], g, ans[16], num = 10000000,num1,vis[16];
    
    bool check()
    {
        for (int i = 1; i <= v; i++)
            if (a[i] > 0)
                return false;
        return true;
    }
    
    void biaoji()
    {
        int temp = 0;
        for (int i = 1; i <= g; i++)
            if (vis[i] == 1)
                ans[++temp] = i;
    }
    
    void dfs(int x)
    {
        if (check())
        {
            if (num1 < num)
            {
                num = num1;
                biaoji();
                return;
            }
        }
        if (x > g)
            return;
        for (int i = 1; i <= v; i++)
            a[i] -= G[x][i];
        vis[x] = 1;
        num1++;
        dfs(x + 1);
        for (int i = 1; i <= v; i++)
            a[i] += G[x][i];
        vis[x] = 0;
        num1--;
        dfs(x + 1);
    }
    
    int main()
    {
        scanf("%d", &v);
        for (int i = 1; i <= v; i++)
            scanf("%d", &a[i]);
        scanf("%d", &g);
        for (int i = 1; i <= g; i++)
            for (int j = 1; j <= v; j++)
                scanf("%d", &G[i][j]);
        dfs(1);
        printf("%d ", num);
        for (int i = 1; i <= num; i++)
            printf("%d ", ans[i]);
    
        return 0;
    }
  • 相关阅读:
    OpenWRT Mac 虚拟机PD 分享 for 软路由
    How to write u disk from img in mac os x
    linux find file > 100 M
    gojs for data flow
    正则表达式
    grep
    搜索引擎Query Rewrite
    Kafka replication
    cassandra写数据CommitLog
    Solr DIH JDBC 源码解析
  • 原文地址:https://www.cnblogs.com/zbtrs/p/5910855.html
Copyright © 2011-2022 走看看