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

被卡了一个小时,第一次写剪纸的蒟蒻就是我。

首先就是要枚举不重复的子集,根据测算,只需要枚举25 +24 +23  +...+1 = (25 + 1)*25/2个子集,所以时间复杂度是相当低的。

但是如果枚举成25!的子集,一定会崩掉。

我们为了避免枚举重复的子集,采取了这样的枚举自己方法(紫书里还有一种):

枚举子集内元素个数1..n,并保证子集是单调递增的。这样就能够补充不漏的枚举子集。

上代码。

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm> const int MAXN = 25 + 15;
const int MAXM = 15 + 15; int n;
int min[MAXN];
int m;
int value[MAXM][MAXN]; int c[MAXN]; int num[MAXN];
bool b[MAXM]; bool IsFull[MAXN]; int ans; int cnt;
bool ok; void dfs(int step,int pre)
{
if(ok)return;
if(step > cnt + 1) return;
if(step == cnt + 1)
{
for(int i = 1;i <= n;i ++)
{
int sum = 0;
for(int j = 1;j <= cnt;j ++)
{
sum += value[num[j]][i];
}
if(sum < min[i])return;
}
ans = cnt;
ok = true;
return;
} for(int i = 1;i <= m;i ++)
{
if(ok)return;
if(i <= pre)continue;
if(!b[i])
{
num[step] = i;
b[i] = true;
dfs(step + 1,i);
b[i] = false;
}
}
} int main()
{
freopen("data.txt", "r", stdin);
ans = 99999999;
scanf("%d", &n);
for(int i = 1;i <= n;i ++)
{
scanf("%d", &min[i]);
}
scanf("%d", &m);
for(int i = 1;i <= m;i ++)
{
for(int j = 1;j <= n;j ++)
{
scanf("%d", &value[i][j]);
}
}
for(int i = 1;i <= m;i ++)
{
cnt ++;
dfs(1,0);
if(ok) break;
}
printf("%d ", ans);
for(int i = 1;i <= ans;i ++)
{
printf("%d ", num[i]);
}
return 0;
}

P1460 健康的荷斯坦奶牛 Healthy Holsteins的更多相关文章

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

    P1460 健康的荷斯坦奶牛 Healthy Holsteins 题目描述 农民JOHN以拥有世界上最健康的奶牛为傲.他知道每种饲料中所包含的牛所需的最低的维他命量是多少.请你帮助农夫喂养他的牛,以保 ...

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

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

  3. P1460 健康的荷斯坦奶牛 Healthy Holsteins (简单的dfs)

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

  4. P1460 健康的荷斯坦奶牛 Healthy(DFS)

    思路:这道题还是用了小小的剪枝,这里要注意的是该题有很多中构建树的顺序,但是,在这众多顺序中不一定都能保证输出的方案字典序最小. 构建搜索树:如图构建 剪枝,emmm,看代码: #include< ...

  5. USACO Healthy Holsteins

    首先看题目: Healthy HolsteinsBurch & Kolstad Farmer John prides himself on having the healthiest dair ...

  6. USACO 2.1 Healthy Holsteins

    Healthy HolsteinsBurch & Kolstad Farmer John prides himself on having the healthiest dairy cows ...

  7. p1460 Healthy Holsteins

    列举所有的子集找最优就行. #include <iostream> #include <cstdio> #include <cmath> #include < ...

  8. 【USACO 2.1】Healthy Holsteins

    /* TASK: holstein LANG: C++ URL: http://train.usaco.org/usacoprob2?a=SgkbOSkonr2&S=holstein SOLV ...

  9. USACO Healthy Holsteins DFS

    使用排列组合,遍历所有可能的情况C(1)+C(2)+C(3)……C(n)= 2^G种组合 数据规模不大,暴力过去最多也就是2^15 = 23768种情况 所以就暴力咯,不过还是Debug了一会 Sou ...

随机推荐

  1. sql不用拼接语句实现动态查询条件

    DECLARE @oFrom INT SELECT * FROM baseinfo AND ( ( and Type = 'Breakfast') ) or的条件可自由添加,尤其适用互斥条件的查询.

  2. iOS开发CoreData的多表关联

    1.多表关联 多表关联,对SQL 数据库的操作,在一张表的数据中可以引用另外一张表里的数据.通过 Entity 实体中的 Relationships 来实现,比起传统的 SQL 数据库来,更加简单. ...

  3. php输出json,需要嵌套数组和对象问题

    https://segmentfault.com/q/1010000009985295 $tmp = []; $tmp['id'] = 'aaa'; $tmp['name'] = 'bbb'; $tm ...

  4. CentOS源码安装Wireshark

    (2019年2月19日注:这篇文章原先发在自己github那边的博客,时间是2016年8月25日) Wireshark为网络管理员常用的一个网络管理工具,通过使用这个软件,我们可以对本机网卡上的经过的 ...

  5. 《DSP using MATLAB》Problem 8.26

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  6. Python GUI文本编辑器

    使用Python编写一个简单的文本编辑器,需要展示一个用户界面,功能包括打开.保存文本文件. 使用tkinter库来编写GUI. #简单GUI文本编辑器 from tkinter import * f ...

  7. java后台对上传的图片进行压缩

    java开发中经常遇到对图片的处理,JDK中也提供了对应的工具类,不过处理起来很麻烦,Thumbnailator是一个优秀的图片处理的开源Java类库,处理效果远比Java API的好,从API提供现 ...

  8. 解决微信浏览器内video全屏问题

    前端离职,让我写个视频播放页面,木办法只有我来搞了. 默认用h5的 video标签 测试时候发现微信浏览器内访问video自动全屏播放. 搜了下 webkit-playsinline="tr ...

  9. JavaSE_02_Thread类01

    1.1 并发与并行 并发:指两个或多个事件在同一个时间段内发生. 这在单 CPU 系统中,每一时刻只能有一道程序执行,即微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那是因为分时交替运 ...

  10. 深入浅出 Java Concurrency (15): 锁机制 part 10 锁的一些其它问题[转]

    主要谈谈锁的性能以及其它一些理论知识,内容主要的出处是<Java Concurrency in Practice>,结合自己的理解和实际应用对锁机制进行一个小小的总结. 首先需要强调的一点 ...