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

P1460 健康的荷斯坦奶牛 Healthy Holsteins

  •  
  • 168通过
  • 340提交
  • 题目提供者该用户不存在
  • 标签USACO
  • 难度普及-

 提交  讨论  题解  

最新讨论

  • 2个数据超时,求优化

题目描述

农民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

分析:因为每个饲料可以吃也可以不吃,所以想到0-1背包,但是记录状态比较麻烦,而且数据这么小,不妨试试暴搜,可以搜索子集,然后检验是否合适,或者一个饲料一个饲料的搜索,要么选要么不选,注意判断一下就好了.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int v, a[30], G[16][30], g, ans[16], num = 10000000,num1,vis[16];

bool check()
{
    for (int i = 1; i <= v; i++)
        if (a[i] > 0)
            return false;
    return true;
}

void biaoji()
{
    int temp = 0;
    for (int i = 1; i <= g; i++)
        if (vis[i] == 1)
            ans[++temp] = i;
}

void dfs(int x)
{
    if (check())
    {
        if (num1 < num)
        {
            num = num1;
            biaoji();
            return;
        }
    }
    if (x > g)
        return;
    for (int i = 1; i <= v; i++)
        a[i] -= G[x][i];
    vis[x] = 1;
    num1++;
    dfs(x + 1);
    for (int i = 1; i <= v; i++)
        a[i] += G[x][i];
    vis[x] = 0;
    num1--;
    dfs(x + 1);
}

int main()
{
    scanf("%d", &v);
    for (int i = 1; i <= v; i++)
        scanf("%d", &a[i]);
    scanf("%d", &g);
    for (int i = 1; i <= g; i++)
        for (int j = 1; j <= v; j++)
            scanf("%d", &G[i][j]);
    dfs(1);
    printf("%d ", num);
    for (int i = 1; i <= num; i++)
        printf("%d ", ans[i]);

    return 0;
}

 

posted @ 2016-09-26 21:49  zbtrs  阅读(1282)  评论(0编辑  收藏  举报