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

题目描述

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

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

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

输入输出格式

输入格式:

 

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

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

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

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

 

输出格式:

 

输出文件只有一行,包括

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

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

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

 

输入输出样例

输入样例#1: 复制
4
100 200 300 400
3
50  50  50  50
200 300 200 300
900 150 389 399
输出样例#1: 复制
2 1 3

说明

USACO 2.1

翻译来自NOCOW

思路:搜索。

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int v,g;
struct nond{
    int f[30];
}vv[20];
int num[30],pos[30];
int ans[30],vis[30];
int judge(){
    for(int i=1;i<=v;i++)
        if(pos[i]<num[i])    return false;
    return true;
}
void dfs(int tot,int sum,int pre){
    if(sum==tot){
        if(judge()){
            cout<<tot<<" ";
            for(int i=1;i<=tot;i++)    cout<<ans[i]<<" ";
            exit(0);
        }
        return ;
    }
    for(int i=pre+1;i<=g;i++)
        if(!vis[i]){
            vis[i]=1;
            ans[sum+1]=i;
            for(int j=1;j<=v;j++)    pos[j]+=vv[i].f[j];
            dfs(tot,sum+1,i);
            for(int j=1;j<=v;j++)    pos[j]-=vv[i].f[j];
            vis[i]=0;
        }
}
int main(){
    scanf("%d",&v);
    for(int i=1;i<=v;i++)    scanf("%d",&num[i]);
    scanf("%d",&g);
    for(int i=1;i<=g;i++)
        for(int j=1;j<=v;j++)
            scanf("%d",&vv[i].f[j]);
    for(int i=1;i<=g;i++){
        memset(vis,0,sizeof(vis));
        memset(pos,0,sizeof(pos));
        dfs(i,0,0);
    }
}

 

posted @ 2017-12-07 19:47  一蓑烟雨任生平  阅读(282)  评论(0编辑  收藏  举报