洛谷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("\n");
    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\n",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;
}

 

 

posted @ 2016-11-13 18:22  SilverNebula  阅读(379)  评论(0编辑  收藏  举报
AmazingCounters.com