您的位置:首页 > 其它

USACO 2.1 健康的好斯坦奶牛

2016-04-08 21:43 441 查看
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



解题思路:读入数据,用深搜,从第一层开始,先判断是否满足条件,如果满足就更新存储,如果超过实际最多层数或超过实际最多方案数就退出,不然就用循环开始接着往下搜索,最后输出ans数组里面的数据即可。



程序:

var

a,ans,b:array[0..30]of longint;

c:array[0..20,0..30]of longint;

v,i,j,g,min:longint;


function pd:boolean;

var

i:longint;

begin

for i:=1 to v do

if a[i]>0 then exit(false);

exit(true);

end;


procedure dfs(x,h,k:longint);

var

i:longint;

begin

if (pd) and (h-1

if h>g then exit;

if x>g then exit;

if k=1 then

begin

b[h]:=x;

for i:=1 to v do

dec(a[i],c[x,i]);

dfs(x+1,h+1,1);

dfs(x+1,h+1,0);

for i:=1 to v do

inc(a[i],c[x,i]);

end;

if k=0 then

begin

dfs(x+1,h,1);

dfs(x+1,h,0);

end;

end;


begin

readln(v);

for i:=1 to v do

read(a[i]);

readln;

readln(g);

for i:=1 to g do

begin

for j:=1 to v do

read(c[i,j]);

readln;

end;

min:=maxlongint;

dfs(1,1,0);

dfs(1,1,1);

write(min-1,' ');

for i:=1 to min-2 do

write(ans[i],' ');

writeln(ans[min-1]);

end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: