JZOJ1260.【USACO题库】2.1.4 Healthy Holsteins健康的好斯坦奶牛

本文介绍了一个饲料组合优化问题,目标是最小化满足奶牛营养需求的饲料种类数量。通过深度优先搜索算法,寻找最少种类的饲料来满足所需维生素的最低标准。

题目描述

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

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

PROGRAM NAME: holstein

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

输入

输出

样例输入

样例输出

数据范围限制

这题拖了很久没做,以前以为是某种DP,就没怎么看

然而昨天注意到这个东西:
这里写图片描述
WTF?
WAIT?g≤15?
O(2^g)的深搜,smg……

代码:

type
        arr=array[0..100]of longint;
var
        f:array[0..100,0..100]of longint;
        n,i,j,v,g:longint;
        a,b,c,ans:arr;
procedure search(m,value:longint;ar1,ar2:arr);
var
        bz:boolean;
        i:longint;
begin
        bz:=true;
        for i:=1 to v do
        if ar1[i]<a[i] then
        begin
                bz:=false;
                break;
        end;
        if (bz)and(value<n)then
        begin
                n:=value;
                for i:=1 to v do
                        ans[i]:=ar2[i];
                exit;
        end;
        if m>g then exit;
        for i:=1 to v do ar1[i]:=ar1[i]+f[m,i];
        ar2[value+1]:=m;
        search(m+1,value+1,ar1,ar2);
        for i:=1 to v do ar1[i]:=ar1[i]-f[m,i];
        ar2[value+1]:=0;
        search(m+1,value,ar1,ar2);
end;
begin
        readln(v);
        for i:=1 to v do
                read(a[i]);
        readln(g);
        for i:=1 to g do
                for j:=1 to v do
                        read(f[i,j]);
        n:=maxlongint;
        search(1,0,b,c);
        write(n,' ');
        for i:=1 to n do
                write(ans[i],' ');
end.

我承认,这个爆搜不怎么优美

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值