您的位置:首页 > 其它

USACO Healthy Holsteins 健康的好斯坦奶牛

2017-06-11 22:25 363 查看
农民JOHN以拥有世界上最健康的奶牛为骄傲。他知道每种饲料中所包含的的牛所需的最低的维他命量是多少。请你帮助农夫喂养他的牛,以保持他们的健康,使喂给牛的饲料的种数最少。给出牛所需的最低的维他命,输出喂给牛需要哪些种类的饲料?
给出牛所需的最低的维他命量,输出喂给牛需要哪些种类的饲料,且所需的饲料剂量最少。
维他命量以整数表示,每种饲料最多只能对牛使用一次,数据保证存在解。
INPUT FORMAT
第1 行:一个整数V(1<=V<=25),表示需要的维他命的种类数。
第2 行:V个整数(1<=每个数<=1000),表示牛每天需要的维他命的最小量。
第3 行:一个整数G(1<=G<=15),表示可用来喂牛的饲料的数量。下面G行,第i行表示编号为i饲料包含的各种维他命的量的多少。
SAMPLE INPUT (file holstein.in)
4
100 200 300 400
3
50 50 50 50
200 300 200 300
900 150 389 399
OUTPUT FORMAT
输出文件只有一行,包括:
牛必需的最小的饲料种数P
后面有P个数,表示所选择的饲料编号(按从小到大排列)。
SAMPLE OUTPUT (file holstein.out)
2 1 3


这一题,一开始我想了很久的正解,后来发现是一个多维的有条件的背包,果断放弃,又看了看数据范围,发现可以暴力,于是,在暴力这条路上就越走越远了……

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int need[21],sum;
int ans=2147483647;
int a[101][101],now[101];
int n,m,da[101],b[101];
void dfs(int k)
{
int i;
if(k>n)
{
if(ans<sum)return;
for(i=1;i<=m;i++)
if(now[i]<need[i])return;
for(i=1;i<=n;i++)
da[i]=b[i];
ans
b48f
=sum;
}
else
{
b[k]=0; dfs(k+1);
b[k]=1; sum++;
for(i=1;i<=m;i++)
now[i]+=a[k][i];
dfs(k+1); sum--; b[k]=0;
for(i=1;i<=m;i++)
now[i]-=a[k][i];
}
}
int main()
{
freopen("holsteins.in","r",stdin);
freopen("holsteins.out","w",stdout);
int i,j;
scanf("%d",&m);
for(i=1;i<=m;i++)
scanf("%d",&need[i]);
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&a[i][j]);
dfs(1);
ans=0;
for(i=1;i<=n;i++)
if(da[i])ans++;
cout<<ans<<" ";
for(i=1;i<=n;i++)
if(da[i])printf("%d ",i);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: