USACO 2.1.4 Healthy Holsteins 健康的好斯坦奶牛 DFS & 组合

Problem D: 2.1.4 Healthy Holsteins 健康的好斯坦奶牛

Time Limit: 1 Sec  Memory Limit: 64 MB
Submit: 9  Solved: 6
[Submit][Status][Web Board]

Description

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

Input

第1行:一个整数V(1<=V<=25),表示需要的维他命的种类数。第2行:V个整数(1<=每个数<=1000),表示牛每天需要的维他命的最小量。第3行:一个整数G(1<=G<=15),表示可用来喂牛的饲料的数量。下面G行,第i行表示编号为i饲料包含的各种维他命的量的多少。

Output

输出文件只有一行,包括:牛必需的最小的饲料种数P 后面有P个数,表示所选择的饲料编号(按从小到大排列)。

Sample Input

4
100 200 300 400
3
50 50 50 50
200 300 200 300
900 150 389 399

Sample Output

2 1 3




DFS实现排列组合

#include
using namespace std;

int a[20],visit[20];                       //a 记录使用的饲料序列,visit标记是否使用
int v[30],g[20][30],v2[30];
int bool1,bool2,t;
int n,m;


void DFS(int x,int k)
{
    int j;
    if(x==k)
    {
        bool1=1;
        for(t=1;t<=n;t++)
            if(v[t]>v2[t])
            {
                bool1=0;
                break;
            }

        if(bool1==1)
        {
            cout<             for(t=1;t<=k;t++)
            {
                cout<<" "<             }
            bool2=1;
        }
        return ;
    }
    x++;
    for(j=a[x-1]+1;j<=m;j++)
    {
        if(visit[j]==0)
        {
            visit[j]=1;
            a[x]=j;
            for(t=1;t<=n;t++)
            {
                v2[t]+=g[j][t];
            }
            DFS(x,k);
            if(bool2==1)
                break;
            visit[j]=0;
            for(t=1;t<=n;t++)
            {
                v2[t]-=g[j][t];
            }
        }
    }
}

int main()
{
    int i,j,k;
    //输入
    cin>>n;
    for(i=1;i<=n;i++)
        cin>>v[i];
    cin>>m;
    for(i=1;i<=m;i++)
        for(j=1;j<=n;j++)
            cin>>g[i][j];

    bool2=0;
    for(k=1;k<=m;k++)                        //k表示使用饲料的总数
    {
        for(i=1;i<=m;i++)                    //i表示从第一种饲料开始遍历
        {
            if(visit[i]==0)
            {
                visit[i]=1;
                a[1]=i;
                for(t=1;t<=n;t++)
                    v2[t]+=g[i][t];          //使用第i种饲料后,共组成的元素含量
                DFS(1,k);
                if(bool2==1)
                    break;
                visit[i]=0;
                for(t=1;t<=n;t++)
                {
                    v2[t]-=g[i][t];
                }
            }
        }
        if(bool2==1)
            break;
    }
    return 0;
}

你可能感兴趣的:(DFS)