USACO 2.1.4 Healthy Holsteins

来源:互联网 发布:狼群算法求解 编辑:程序博客网 时间:2024/03/29 07:27

Translation

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

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

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

PROGRAM NAME: holstein

INPUT FORMAT:(file holstein.in)

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

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

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

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

OUTPUT FORMAT:(file holstein.out)

输出文件只有一行,包括牛必需的最小的饲料种数P

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

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

Solution

dfs水题,没什么好说的,直接做就好了

Code

#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;const int maxn=25+10;const int maxm=15+10;int v[maxn],a[maxm][maxn],p[maxm],sum[maxn];int n,m,tmp;int check(){int flag=0,i,j;memset(sum,0,sizeof(sum));for(i=1;i<=m;i++)if(p[i])for(j=1;j<=n;j++)sum[j]+=a[i][j];for(i=1;i<=n;i++)if(sum[i]<v[i]){flag=1;break;}if(flag)return 0;else return 1;}void dfs(int x,int step,int max){int i,j;if(x==0 && check()){printf("%d ",step);int t=0;for(i=1;i<=m;i++)if(t==0 && p[i]){printf("%d",i);t=1;}else if(p[i])printf(" %d",i);tmp=1;puts("");}if(tmp)return;if(x==0)return;for(i=max+1;i<=m;i++)if(!p[i]){p[i]=1;dfs(x-1,step,i);p[i]=0;}}int main(){int i,j,k;freopen("holstein.in","r",stdin);freopen("holstein.out","w",stdout);scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&v[i]);scanf("%d",&m);for(i=1;i<=m;i++)for(j=1;j<=n;j++)scanf("%d",&a[i][j]);for(i=1;i<=m;i++){dfs(i,i,0);if(tmp)break;}return 0;}


1 0
原创粉丝点击