usaco Healthy Holsteins

 题意为有一头牛,它每天所需的维生素有V种,每种维生素的需求量给出,同时给出G种已知的饲料,求如何组合这些饲料可以使得牛获得足够的维生素;

给的数据范围很小,直接暴力枚举所有

/*
ID: modengd1
PROG: holstein
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;
int V,G,food[15][1000],cow[1000];
int ans1,ans2;
int main()
{
    freopen("holstein.in","r",stdin);
    freopen("holstein.out","w",stdout);
    scanf("%d",&V);
    ans1=20;
    for(int i=0;i<V;i++)
        scanf("%d",&cow[i]);
    scanf("%d",&G);
    for(int i=0;i<G;i++)
    {
        for(int j=0;j<V;j++)
            scanf("%d",&food[i][j]);
    }
    int ans=0;
    bool isfind=false;
    for(int i=0;i<(1<<G);i++)//枚举所有的饲料组合
    {
        int now[1000];
        memset(now,0,sizeof(now));
        isfind=true;
        for(int j=0;j<V;j++)//计算所有的营养
        {
            for(int k=0;k<G;k++)//检查这个饲料喂不喂
            {
                if((1<<k)&i)
                    now[j]+=food[k][j];
            }
            if(now[j]<cow[j])//若i的组合下维生素j不够则跳出
            {
                isfind=false;
                break;
            }
        }
        if(isfind)
        {
            int ans=0,j;
            j=i;
            while(j!=0)//获取一共有多少位上是1
            {
                ans++;
                j-=(j&-j);
            }
            if(ans<ans1)//判断是否比以前得到的答案所喂得饲料种类少
            {
                ans1=ans;
                ans2=i;
            }
        }
    }
    cout<<ans1;
    for(int k=0;k<G;k++)
    {
        if(1<<k&ans2)
            cout<<' '<<k+1;
    }
    cout<<endl;
    return 0;
}

  

饲料的组即可,我使用的是用G位二进制各位上的0和1来判断取不取。

posted on 2015-09-02 21:08  insaneman  阅读(229)  评论(0编辑  收藏  举报

导航