首页 > 代码库 > 洛谷P1460 健康的荷斯坦奶牛 Healthy Holsteins

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

题目描述

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

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

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

输入输出格式

输入格式:

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

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

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

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

输出格式:

输出文件只有一行,包括

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

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

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

输入输出样例

输入样例#1:
4100 200 300 400350  50  50  50200 300 200 300900 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;}

 

 

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