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

    题目描述

    农民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

    又是一道奶牛题。

    暴搜就能过

    /*by SilverN*/
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<vector>
    using namespace std;
    const int mxn=30;
    int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int rans=1e9;
    int ans[mxn];
    int n,v[mxn],g,w[mxn][mxn];
    int now[mxn],cpy[mxn];
    bool check(){
    //    for(int i=1;i<=n;i++)printf("%d ",now[i]);
    //    printf("
    ");
        for(int i=1;i<=n;i++)
            if(now[i]<v[i])return 0;
        return 1;
    }
    void DFS(int res,int pos){
        if(res>=rans)return;
        if(check()){
            rans=res;
            memcpy(ans,cpy,sizeof ans);
            return;
        }
    //    printf("%d %d
    ",res,pos);
        for(int i=pos;i<=g;i++){
            for(int j=1;j<=n;j++)now[j]+=w[i][j];
            cpy[res]=i;
            DFS(res+1,i+1);
            for(int j=1;j<=n;j++)now[j]-=w[i][j];
        }
        return;
    }
    int main(){
        n=read();
        int i,j;
        for(i=1;i<=n;i++)v[i]=read();
        g=read();
        for(i=1;i<=g;i++)
         for(j=1;j<=n;j++)
             w[i][j]=read();
        DFS(1,1);
        printf("%d ",rans-1);
        for(i=1;i<rans;i++)printf("%d ",ans[i]);
        return 0;
    }
  • 相关阅读:
    struct pack unpack
    读书笔记 第四章&第五章
    The Sieve of Eratosthens(爱拉托逊斯筛选法)
    2013年3月百度之星A题
    2013年3月百度之星B题
    好句子
    BFS 与 DFS
    记录本
    HDU 2028 如何计算最小公倍数?
    HDU 2015 偶数求和 解题报告
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6059426.html
Copyright © 2011-2022 走看看